Подтвердить что ты не робот

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

Простите, что это очень простой 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:

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

4b9b3361

Ответ 1

Я думаю, файл file.sh с терминаторами линии CRLF.

бег

dos2unix file.sh

тогда проблема будет исправлена.

Вы можете установить dos2unix в ubuntu следующим образом:

sudo apt-get install dos2unix

Ответ 2

Еще одна вещь, которую нужно проверить (только что произошло со мной):

  • завершать тела однострочных функций с точкой с запятой

т.е. этот невинно выглядящий фрагмент вызовет ту же ошибку:

die () { test -n "[email protected]" && echo "[email protected]"; exit 1 }

Чтобы сделать немой синтаксический анализатор счастливым:

die () { test -n "[email protected]" && echo "[email protected]"; exit 1; }

Ответ 3

Я также получил это сообщение об ошибке, используя неправильный синтаксис в предложении if

  • else if (синтаксическая ошибка: неожиданный конец файла)
  • elif (правильный синтаксис)

i отлаживает его, комментируя биты до тех пор, пока не сработает

Ответ 4

неблокированное предложение if = > fi также поднимет это значение

tip: используйте trap для отладки, если ваш script огромен...

например. set -x trap read debug ...

Ответ 5

на cygwin Мне нужно: -

 export SHELLOPTS
 set -o igncr

в .bash_profile. Таким образом, мне не нужно было запускать unix2dos

Ответ 6

Я получил этот ответ от fooobar.com/questions/3273052/...

Откройте файл в Vim и попробуйте

:set fileformat=unix

Преобразуйте окончания строки eh в окончание unix и посмотрите, разрешает ли это вопрос. Если вы редактируете в Vim, введите команду: set fileformat = unix и сохраните файл. Несколько других редакторов имеют возможность конвертировать строку таких как Notepad ++ или Atom

Спасибо @lemongrassnginger

Ответ 7

Итак, я нашел этот пост, и ответы не помогли мне, но я смог понять, почему он дал мне ошибку. У меня был

cat > temp.txt < EOF
some content
EOF

Проблема заключалась в том, что я скопировал вышеуказанный код, чтобы быть в функции, и непреднамеренно закрепил код. Необходимо убедиться, что последний EOF не включен.

Ответ 8

Мне удалось вырезать и вставить ваш код в файл, и он работал правильно. если ты выполните его следующим образом:

Ваш файл "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

Ответ 9

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

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

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

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

Ответ 10

Я просто вырезал и ввел ваш пример в файл; он работал нормально под bash. Я не вижу никаких проблем с этим.

Для хорошей меры вы можете убедиться, что она заканчивается символом новой строки, хотя bash не волнует. (Он работает для меня как с окончанием новой строки, так и без нее.)

Иногда вы видите странные ошибки, если случайно ввели в файл управляющий символ. Поскольку это короткий script, попробуйте создать новый script, вставив его из вашего вопроса здесь в StackOverflow или просто повторно набрав его.

Какую версию bash вы используете? (bash --version)

Удачи!

Ответ 11

Убедитесь, что имя каталога, в котором присутствует файл .sh, не имеет пробела. например: Скажите, находится ли она в папке "Новая папка", вы обязательно столкнетесь с приведенной вами ошибкой. Вместо этого просто назовите его "New_Folder". Надеюсь, это поможет.

Ответ 12

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

Ответ 13

В Ubuntu:

$ gedit ~/.profile

Затем File -> Save as и установите end line в Unix/Linux

Ответ 14

Я знаю, что я слишком поздно на вечеринку. Надеюсь, что это может кому-то помочь.

Проверьте ваш файл .bashrc. Возможно переименуйте или переместите это.

Обсуждение здесь: Невозможно найти простой скрипт bash

Ответ 15

Это происходило со мной, когда я пытался вызвать функцию с помощью паренов, например

run() {
  echo hello
}

run()

должно быть:

run() {
  echo hello
}

run

Ответ 16

Для окон:

В моем случае я работал в ОС Windows, и я получил ту же ошибку при запуске autoconf.

  • Я просто открываю файл configure.ac с помощью своей NOTEPAD++ IDE.
  • Затем я преобразовал Файл с преобразованием EOL в Windows (CR LF) следующим образом:

    РЕДАКТИРОВАТЬ → EOL CONVERSION → ОКНА (CR LF)

Ответ 17

Для людей, использующих MacOS:

Если вы получили файл в формате Windows и хотите запустить на MacOS и видите эту ошибку, выполните эти команды.

brew install dos2unix
sh <file.sh>