Синтаксическая ошибка 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:




ошибка синтаксиса: неожиданный конец файла


2416   13  

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 igncr

in .файл . Таким образом, мне не нужно было запускать 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". Надеюсь, это поможет.

по-видимому, некоторые версии оболочки также могут выдавать это сообщение, когда в последней строке вашего скрипта отсутствует новая строка.

В Ubuntu:

$ gedit ~/.profile

затем, File -> Save as и set end line до Unix/Linux

у меня была проблема, когда я написал заявление "if-fi" в одной строке:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi

написать многострочный решил мою проблему:

if [ -f ~/.git-completion.bash ]; then . ~/.git-completion.bash fi

Comments

    Ничего не найдено.