Синтаксическая ошибка Bash: неожиданный конец файла
Простите меня за это очень простой скрипт в Bash. Вот код:
#!/bin/bash
# june 2011
if [ $# -lt 3 -o $# -gt 3 ]; then
echo "Error... Usage: host database username"
exit 0
fi
после запуска sh file.sh:
ошибка синтаксиса: неожиданный конец файла
13 ответов:
Я думаю, file.sh с возврата каретки и перевода строки конец строки.
run
dos2unix file.shзатем проблема будет исправлена.
вы можете установить dos2unix в ubuntu с этим:
sudo apt-get install dos2unix
еще одна вещь, чтобы проверить (только что произошло со мной):
- завершите тела однострочных функций точкой с запятой
т. е. этот невинный фрагмент вызовет ту же ошибку:
die () { test -n "$@" && echo "$@"; exit 1 }чтобы сделать немой парсер счастливым:
die () { test -n "$@" && echo "$@"; exit 1; }
Я тоже только что получил это сообщение об ошибке, используя неправильный синтаксис в
ifп.
else if(синтаксическая ошибка: неожиданный конец файла)elif(правильный синтаксис)Я отладил его, комментируя биты, пока он не работал
ООН-закрытые, если => предложения Fi будет также поднимать этот
совет: используйте ловушки для отладки, если ваш скрипт огромен...
например
set -x trap read debug ...
на cygwin мне нужно: -
export SHELLOPTS set -o igncrin .файл . Таким образом, мне не нужно было запускать unix2dos
Так что я нашел этот пост и ответы не помогли мне, но я смог выяснить, почему он дал мне ошибку. У меня был
cat > temp.txt < EOF some content EOFпроблема была в том, что я скопировал приведенный выше код, чтобы быть в функции и случайно вставил код. Нужно убедиться, что последний EOF не вкладывается.
я смог вырезать и вставить ваш код в файл, и он работал правильно. Если вы выполните его так, как это должно работать:
ваш "file.sh":
#!/bin/bash # june 2011 if [ $# -lt 3 -o $# -gt 3 ]; then echo "Error... Usage: 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: host database username" exit 0 fiили, так как вы используете
bash, вы может использовать встроенный синтаксис:if [[ $# -lt 3 || $# -gt 3 ]]; then echo "Error... Usage: host database username" exit 0 fiи, наконец, вы могли бы, конечно, просто проверить, если 3 аргумента были даны (чистый, поддерживает совместимость оболочки POSIX):
if [ $# -ne 3 ]; then echo "Error... Usage: host database username" exit 0 fi
Я получил этот ответ от это аналогичная проблема на StackOverflow
откройте файл в Vim и попробуйте
:set fileformat=unixпреобразование EH окончаний строк в Unix окончаний и посмотреть, если это решает вопрос. При редактировании в Vim введите команду: set fileformat=unix и сохранить файл. Несколько других редакторов имеют возможность конвертировать строки окончания, такие как Notepad++ или Atom
спасибо @lemongrassnginger
Я просто вырезал и вставил ваш пример в файл; он отлично работал под bash. Я не вижу никаких проблем с этим.
для хорошей меры вы можете убедиться, что он заканчивается новой строкой, хотя bash не должен беспокоиться. (Это работает для меня, так и без итоговой строки.)
вы иногда будете видеть странные ошибки, если вы случайно встроили управляющий символ в файл. Поскольку это короткий скрипт, попробуйте создать новый скрипт, вставив его из вашего вопроса здесь StackOverflow, или просто перепечатав его.
какую версию bash вы используете? (
bash --version)удачи!
убедитесь, что имя каталога, в котором находится файл .sh, не содержит пробелов. например: скажем, если он находится в папке под названием "Новая папка", вы обязательно столкнетесь с ошибкой, которую вы процитировали. Вместо этого просто назовите его как "New_Folder". Надеюсь, это поможет.
по-видимому, некоторые версии оболочки также могут выдавать это сообщение, когда в последней строке вашего скрипта отсутствует новая строка.
у меня была проблема, когда я написал заявление "if-fi" в одной строке:
if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fiнаписать многострочный решил мою проблему:
if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi
Comments