Ответ 1
TL; DR: ваш script имеет окончание строк CRLF в стиле Windows, ака \r\n
.
Преобразовать в стиль Unix \n
, удалив возврат каретки.
Как проверить, вернулась ли каретка script?
Они обнаруживаются как ^M
в выводе cat -v yourscript
:
$ cat -v myscript
if true^M
then^M
true^M
...
Как удалить их?
Установите редактор, чтобы сохранить файл с окончанием строки Unix, ака "терминаторы строк" или "концевые символы", и сохраните его.
Вы также можете удалить их из командной строки с помощью dos2unix yourscript
или cat yourscript | tr -d '\r' > fixedscript
.
Почему возврат каретки вызывает синтаксические ошибки?
Символ возврата каретки - это еще один символ до bash. then
не совпадает с then\r
, поэтому bash не распознает его как ключевое слово и принимает на себя команду. Затем он продолжает искать then
и терпит неудачу
Если после then
существует конечное пространство, вы получите аналогичную проблему для fi
.