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

Когда я запускаю следующий фрагмент кода

#!/bin/bash
if [ "foo" = "foo" ];
then
echo "true"
else
echo "false"
fi
echo "end"

я получил

sfm_write_buffer_test.sh: line 9: syntax error: unexpected end of file

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


person bicepjai    schedule 29.08.2011    source источник
comment
Попробуйте удалить точку с запятой в конце инструкции if.   -  person Rafe Kettler    schedule 30.08.2011
comment
Я просто скопировал и вставил вышеуказанное в скрипт в своей системе и запустил его. На выходе были две строки: true и end. Тот же результат с версиями bash 2.01.1, 3.2.25 и 4.2.8.   -  person Keith Thompson    schedule 30.08.2011
comment
Это один из наших самых частых часто задаваемых вопросов. Удивлен, что потребовалось так много времени для близкого дубликата.   -  person Charles Duffy    schedule 16.10.2016


Ответы (3)


Вы на Cygwin, верно?

Как я сказал в комментарии, когда я копирую и вставляю ваш скрипт и запускаю его в своей системе, он работает; вывод

true
end

Но когда я меняю окончания строк со стиля Unix '\n' на стиль Windows '\r\n', я получаю ту же ошибку, что и вы.

С окончаниями строк в стиле Windows bash не видит ключевое слово then; он видит команду с именем then\r. Он никогда не пытается его выполнить, потому что ищет совпадения then или fi для ключевого слова if (которое он распознал, потому что оно не находится в конце строки).

Убедитесь, что ваши сценарии оболочки используют окончания строк в стиле Unix.

person Keith Thompson    schedule 29.08.2011

Проблема в CRLF в конце скрипта. Сценарии оболочки выдают эту ошибку, когда видят окончания строк в стиле Windows. Вам нужно заменить окончания строк в сценарии оболочки на LF в стиле Unix. У каждой IDE есть свой способ сделать это.

Sublime Text 2 ==› Вид -> Концы строк -> Unix

Notepad++ ==› Правка -> Преобразование EOL -> Формат UNIX/OSX

Как только вы внесете это изменение и сохраните файл, сценарий оболочки должен выполниться без ошибок.

person densom    schedule 05.06.2015

Это не было вашей конкретной проблемой, но это также может произойти, если вы вставили heredoc с отступом внутри своего оператора if, и он был преобразован из табуляции в пробелы. Конечный разделитель heredoc никогда не находится из-за пробела, и результатом является неожиданный конец файла.

person Noumenon    schedule 16.10.2016