Синтаксическая ошибка Bash: неожиданный конец файла - PullRequest
80 голосов
/ 16 июня 2011

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

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

Ответы [ 17 ]

112 голосов
/ 16 июня 2011

Я думаю, что file.sh с ограничителями строки CRLF.

пробег * * 1003

dos2unix file.sh

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

Вы можете установить dos2unix в Ubuntu с помощью:

sudo apt-get install dos2unix
97 голосов
/ 08 июля 2014

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

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

Т.е. этот невиновенпросмотр фрагмента кода вызовет ту же ошибку:

die () { test -n "$@" && echo "$@"; exit 1 }

Чтобы порадовать немого парсера:

die () { test -n "$@" && echo "$@"; exit 1; }
29 голосов
/ 26 ноября 2015

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

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

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

12 голосов
/ 28 августа 2017

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

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

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

6 голосов
/ 12 марта 2018

Я получил этот ответ от этой аналогичной проблемы в StackOverflow

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

:set fileformat=unix

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

Спасибо @ lemongrassnginger

6 голосов
/ 17 июня 2013

на Cygwin мне нужно: -

 export SHELLOPTS
 set -o igncr

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

5 голосов
/ 23 августа 2016

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

cat > temp.txt < EOF
some content
EOF

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

1 голос
/ 28 августа 2018

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

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

Пишите многострочно, решил мою проблему:

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

1 голос
/ 16 июня 2011

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

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

Возможно, вы получаете эту ошибку из-за того, как вы делаете ввод (без трубы, моркови, так далее.). Вы также можете попробовать разбить условие на два:

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
0 голосов
/ 07 мая 2019

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

run() {
  echo hello
}

run()

должно быть:

run() {
  echo hello
}

run
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...