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

BASH Синтаксическая ошибка рядом с неожиданным токеном "done"

Любая идея о том, что может быть проблемой?

Мой код:

#!/bin/bash
while :
do
echo "Press [CTRL+C] to stop.."
sleep 1
done

Сохранено как .sh и запущено bash file.sh

CentOS 6 32-разрядный

В чем проблема? В первый раз, когда используется BASH, нужно что-то для простого бесконечного цикла на что-то.

4b9b3361

Ответ 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'