Ответ 1
Я думаю, файл file.sh с терминаторами линии CRLF.
бег
dos2unix file.sh
тогда проблема будет исправлена.
Вы можете установить dos2unix в ubuntu следующим образом:
sudo apt-get install dos2unix
Простите, что это очень простой script в Bash. Здесь код:
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
после запуска sh file.sh:
Синтаксическая ошибка: неожиданный конец файла
Я думаю, файл file.sh с терминаторами линии CRLF.
бег
dos2unix file.sh
тогда проблема будет исправлена.
Вы можете установить dos2unix в ubuntu следующим образом:
sudo apt-get install dos2unix
Еще одна вещь, которую нужно проверить (только что произошло со мной):
т.е. этот невинно выглядящий фрагмент вызовет ту же ошибку:
die () { test -n "[email protected]" && echo "[email protected]"; exit 1 }
Чтобы сделать немой синтаксический анализатор счастливым:
die () { test -n "[email protected]" && echo "[email protected]"; exit 1; }
Я также получил это сообщение об ошибке, используя неправильный синтаксис в предложении if
else if
(синтаксическая ошибка: неожиданный конец файла)elif
(правильный синтаксис)i отлаживает его, комментируя биты до тех пор, пока не сработает
неблокированное предложение if = > fi также поднимет это значение
tip: используйте trap для отладки, если ваш script огромен...
например.
set -x
trap read debug
...
на cygwin Мне нужно: -
export SHELLOPTS
set -o igncr
в .bash_profile. Таким образом, мне не нужно было запускать unix2dos
Я получил этот ответ от fooobar.com/questions/3273052/...
Откройте файл в Vim и попробуйте
:set fileformat=unix
Преобразуйте окончания строки eh в окончание unix и посмотрите, разрешает ли это вопрос. Если вы редактируете в Vim, введите команду: set fileformat = unix и сохраните файл. Несколько других редакторов имеют возможность конвертировать строку таких как Notepad ++ или Atom
Спасибо @lemongrassnginger
Итак, я нашел этот пост, и ответы не помогли мне, но я смог понять, почему он дал мне ошибку. У меня был
cat > temp.txt < EOF
some content
EOF
Проблема заключалась в том, что я скопировал вышеуказанный код, чтобы быть в функции, и непреднамеренно закрепил код. Необходимо убедиться, что последний EOF не включен.
Мне удалось вырезать и вставить ваш код в файл, и он работал правильно. если ты выполните его следующим образом:
Ваш файл "file.sh":
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Команда:
$ ./file.sh arg1 arg2 arg3
Обратите внимание, что "file.sh" должен быть выполнен:
$ chmod +x file.sh
Вы можете получить эту ошибку b/c от того, как вы делаете ввод (с трубой, морковью, и т.д.). Вы также можете попробовать расщепить условие на два:
if [ $# -lt 3 ] || [ $# -gt 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
Или, поскольку вы используете bash
, вы можете использовать встроенный синтаксис:
if [[ $# -lt 3 || $# -gt 3 ]]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
И, наконец, вы могли бы, конечно, просто проверить, были ли предоставлены 3 аргумента (чистые, поддерживает совместимость оболочки POSIX):
if [ $# -ne 3 ]; then
echo "Error... Usage: $0 host database username"
exit 0
fi
У меня была проблема, когда я писал "if - fi" в одной строке:
if [ -f ~/.git-completion.bash ]; then. ~/.git-completion.bash fi
Написать многострочно решил мою проблему:
if [ -f ~/.git-completion.bash ]; then. ~/.git-completion.bash fi
Я просто вырезал и ввел ваш пример в файл; он работал нормально под bash. Я не вижу никаких проблем с этим.
Для хорошей меры вы можете убедиться, что она заканчивается символом новой строки, хотя bash не волнует. (Он работает для меня как с окончанием новой строки, так и без нее.)
Иногда вы видите странные ошибки, если случайно ввели в файл управляющий символ. Поскольку это короткий script, попробуйте создать новый script, вставив его из вашего вопроса здесь в StackOverflow или просто повторно набрав его.
Какую версию bash вы используете? (bash --version
)
Удачи!
Убедитесь, что имя каталога, в котором присутствует файл .sh, не имеет пробела. например: Скажите, находится ли она в папке "Новая папка", вы обязательно столкнетесь с приведенной вами ошибкой. Вместо этого просто назовите его "New_Folder". Надеюсь, это поможет.
По-видимому, некоторые версии оболочки также могут выдать это сообщение, когда в последней строке вашего script отсутствует новая строка.
В Ubuntu:
$ gedit ~/.profile
Затем File -> Save as
и установите end line
в Unix/Linux
Я знаю, что я слишком поздно на вечеринку. Надеюсь, что это может кому-то помочь.
Проверьте ваш файл .bashrc. Возможно переименуйте или переместите это.
Обсуждение здесь: Невозможно найти простой скрипт bash
Это происходило со мной, когда я пытался вызвать функцию с помощью паренов, например
run() {
echo hello
}
run()
должно быть:
run() {
echo hello
}
run
Для окон:
В моем случае я работал в ОС Windows, и я получил ту же ошибку при запуске autoconf.
Затем я преобразовал Файл с преобразованием EOL в Windows (CR LF) следующим образом:
РЕДАКТИРОВАТЬ → EOL CONVERSION → ОКНА (CR LF)
Для людей, использующих MacOS:
Если вы получили файл в формате Windows и хотите запустить на MacOS и видите эту ошибку, выполните эти команды.
brew install dos2unix
sh <file.sh>