BASH Синтаксическая ошибка рядом с неожиданным токеном "done"
Любая идея о том, что может быть проблемой?
Мой код:
#!/bin/bash
while :
do
echo "Press [CTRL+C] to stop.."
sleep 1
done
Сохранено как .sh и запущено bash file.sh
CentOS 6 32-разрядный
В чем проблема? В первый раз, когда используется BASH, нужно что-то для простого бесконечного цикла на что-то.
Ответы
Ответ 1
Запустите cat -v file.sh
.
Скорее всего, у вас есть возврат каретки или свободное место в вашем файле. cat -v
покажет их как ^M
и M-BM-
или M-
соответственно. Он также будет показывать любые другие странные символы, которые вы, возможно, попали в ваш файл.
Удалите разрывы строк Windows с помощью
tr -d '\r' file.sh > fixedfile.sh
Ответ 2
Я получал ту же ошибку на Cygwin; Я сделал следующее (один из них исправил его):
- Преобразован
TABS
в SPACES
- выполнил
dos2unix
в файле .(ba)sh
Ответ 3
Какая ошибка вы получаете?
$ bash file.sh
test.sh: line 8: syntax error: unexpected end of file
Если вы получите эту ошибку, у вас могут быть неудачные окончания строк. Unix использует <LF>
в конце файла, а Windows использует <CR><LF>
. Этот символ <CR>
интерпретируется как символ.
Вы можете использовать od -a test.sh
для просмотра невидимых символов в файле.
$ od -a test.sh
0000000 # ! / b i n / b a s h cr nl # sp cr
0000020 nl w h i l e sp : cr nl d o cr nl sp sp
0000040 sp sp e c h o sp " P r e s s sp [ C
0000060 T R L + C ] sp t o sp s t o p " cr
0000100 nl sp sp sp sp s l e e p sp 1 cr nl d o
0000120 n e cr nl
0000124
sp
обозначает пробел, ht
обозначает вкладку, cr
обозначает <CR>
, а nl
обозначает <LF>
. Обратите внимание, что все строки заканчиваются на cr
, за которым следует символ nl
.
Вы также можете использовать cat -v test.sh
, если ваша команда cat
принимает параметр -v
.
Если у вас есть dos2unix
на вашем поле, вы можете использовать эту команду для исправления вашего файла:
$ dos2unix test.sh
Ответ 4
Открыть новый файл с именем foobar
nano -w foobar
Вход script
#!/bin/bash
while [ 0 = 0 ]; do
echo "Press [CTRL+C] to stop.."
sleep 1
done;
Выход и сохранение
CTRL + X, затем Y и Enter
Установить script исполняемый файл и запустить
chmod +x foobar
./foobar
Ответ 5
Может помочь кому-то еще: у меня возникли такие же проблемы, когда я сделал некоторую "копию-вставку" из документа Microsoft Word, где я сделал заметки, в свою оболочку script (s).
Повторная запись вручную, тот же самый код в script просто решил это.
Сначала это было совершенно непонятно, я думаю, что скрытые символы Word и/или форматирование были проблемой. Очевидный, но не видимый... Я потерял около часа на этом (я не эксперт в оболочке, как вы могли догадаться...)
Ответ 6
Иногда эта ошибка возникает из-за непредвиденных символов CR в файле, обычно потому, что файл был сгенерирован в системе Windows, которая использует окончания строки CR. Вы можете исправить это, запустив os2unix
или tr
, например:
tr -d '\ 015' < yourscript.sh > newscript.sh
Это удаляет из файла любые символы CR.
Ответ 7
Отредактируйте свой код в любой среде Linux, тогда вы не столкнетесь с этой проблемой. Если редактировать в окнах
блокнот в любом пространстве возьмет его как ^ М.
Ответ 8
У меня точно такая же проблема, как и выше, и я провел целый день, чтобы понять, что мне не нравится мой подход к новой линии. Вместо этого я использовал один и тот же код с подходом с двоеточием.
Например, мой исходный код с использованием новой строки (которая забросила ту же ошибку, что и ваша):
Y=1
while test "$Y" -le "20"
do
echo "Number $Y"
Y=$[Y+1]
done
И используя код с точкой с запятой с работающим чудом:
Y=1 ; while test "$Y" -le "20"; do echo "Number $Y"; Y=$[Y+1] ; done
Я замечаю, что такая же проблема возникает и для других команд, используя подход новой строки, поэтому я думаю, что буду придерживаться точки с запятой для моего будущего кода.
Ответ 9
Там вы можете получить эту проблему, не имея смешанных проблем с новой строкой (по крайней мере, в моей оболочке, которая является GNU bash v4.3.30):
#!/bin/bash
# foo.sh
function foo() {
echo "I am quoting a thing `$1' inside a function."
}
while [ "$input" != "y" ]; do
read -p "Hit `y' to continue: " -n 1 input
echo
done
foo "What could possibly go wrong?"
$ ./foo.sh
./foo.sh: line 11: syntax error near unexpected token `done'
./foo.sh: line 11: `done'
Это связано с тем, что bash расширяет обратные выходы внутри строк с двойными кавычками (см. руководство bash на quoting и подстановка команд), и перед поиском соответствующего обратного хода будут интерпретировать любые дополнительные двойные кавычки как часть подстановки команды:
$ echo "Command substitution happens inside double-quoted strings: `ls`"
Command substitution happens inside double-quoted strings: foo.sh
$ echo "..even with double quotes: `grep -E "^foo|wrong" foo.sh`"
..even with double quotes: foo "What could possibly go wrong?"
Вы можете обойти это, избегая обратных шагов в вашей строке с помощью обратного слэша или используя строку с одним кавычком.
Я не уверен, почему это дает только одно сообщение об ошибке, но я думаю, что это связано с определением функции:
#!/bin/bash
# a.sh
function a() {
echo "Thing `quoted'"
}
a
while true; do
echo "Other `quote'"
done
#!/bin/bash
# b.sh
echo "Thing `quoted'"
while true; do
echo "Other `quote'"
done
$ ./a.sh
./a.sh: line 10: syntax error near unexpected token `done'
./a.sh: line 10: `done'
$ ./b.sh
./b.sh: command substitution: line 6: unexpected EOF while looking for matching `''
./b.sh: command substitution: line 9: syntax error: unexpected end of file
Thing quote'
./b.sh: line 7: syntax error near unexpected token `done'
./b.sh: line 7: `done'