удар: синтаксическая ошибка около неожиданного маркера '}'

sudo fuser /dev/dm-31
/dev/dm-31:          24799
ps -fp 24799
vbox     24799     1  2 May18 ?        04:37:39 /usr/lib/virtualbox/VBoxHeadle.....

или при использовании LVM2 (на Ubuntu, SLES может варьироваться подробно):

ls -l /dev/mapper | grep dm-1$
lrwxrwxrwx 1 root root       7 May 11 19:01 vg_diablo-var -> ../dm-1

Можно также хотеть проверить man dmsetup например. dmsetup info

2
30.09.2013, 23:25
4 ответа

[ просто другой символ, согласно удару; это не саморазграничивает. Таким образом, необходимо поместить пробелы вокруг [ и ]. Хотя Вы были бы более обеспеченным использованием [[ и ]].

И команда после if (да, [ команда), должен быть завершен с a ; или новая строка.

Наконец, == (который не является posix, FWIW; posix предпочитает =) строковое равенство, не числовое равенство.

Таким образом, Вы, возможно, имели в виду:

if [[ $a -eq 1 ]]; then echo yes; fi

Но Вы могли использовать арифметическую оценку вместо этого:

if ((a == 1)); then echo yes; fi

(В арифметике evalution, равенство ==, и Вам не нужно $ перед именами переменной. Я знаю, что это сбивает с толку.)

Для получения дополнительной информации о [: help test.О нас [[:помощь [[ (который основывается test).О нас ((: help let.О нас bash: man bash

5
27.01.2020, 21:53

[ команда в Bash, точно так же, как любая из других команд такой как if, while, и т.д. Вы видите это, если Вы проверяете страницу справочника дважды:

$ man [
NAME
       bash, :, ., [, alias, bg, bind, break, builtin, caller, cd, command, .....

Можно также сказать, что это - реальная команда с этим примером:

$ type -a [
[ is a shell builtin
[ is /usr/bin/[

Первым результатом является встроенная версия [ это - часть Bash. Второй является версия [ это включено с GNU coreutils.

На Fedora Вы видите, какого об/мин это является часть:

$ rpm -qf /usr/bin/[
coreutils-8.5-7.fc14.x86_64

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

Выполнение этого:

$ if [$a == 1] ...

Было бы идентично этому:

$ lsblah
bash: lsblah: command not found...

ls команда не может быть проанализирована правильно, потому что она не буферизуется с пробелами так, чтобы это было способно синтаксическим анализом.

2
27.01.2020, 21:53

Резюме

Используйте:

if [ "$a" = 1 ]; then echo yes; fi

Полный ответ

Ошибка, о которой сообщает bash:-bash :синтаксическая ошибка рядом с неожиданным токеном `}' — это попытка направить автора кода к ошибке, но bash может легко ошибиться и сигнализировать об ошибке. ошибка там, где ее нет.

На самом деле в коде есть несколько ошибок. Но давайте воспроизведем ошибку, о которой сообщает bash, в более простой строке кода:

$ if true then { true; } fi;
bash: syntax error near unexpected token `}'

Если линия немного изменится, сообщение об ошибке будет примерно в том же месте, но немного в другом:

$ if true then true; fi;
bash: syntax error near unexpected token `fi'

И это также сообщает об ошибке:

$ if true; then; true; fi;
bash: syntax error near unexpected token `;'

Все это происходит потому, что требуемый синтаксис (, скопированный из руководства ), является:

if list; then list; fi;

где list— одна или несколько простых команд (или каналов, или составных команд ), которые заканчиваются новой строкой или точкой с запятой . Обратите внимание, что, как правило, новую строку можно заменить точкой с запятой и наоборот.

Это действительно (синтаксическая ошибка не сообщается)

if   true;   then   true;   fi

Это также верно:

if     true
then   true
fi

или:

if echo start; true; then echo decision; true; echo next; fi;

Или другие варианты перевода строки и/или точки с запятой.

Конечно, последняя точка с запятой не обязательна, но и не запрещена.

Кроме того,[и ]требуют, чтобы (обычно )пробелы различались bash как слова (токены )и поэтому воспринимались как тест

if [ $a == 1 ]; then { echo 'yes'; } fi;       # still subtly incorrect.

Но, кроме того, расширение переменной должно быть заключено в кавычки ("$a"), ==допустимо в bash, но может быть недействительным в некоторых других оболочках, поэтому нам лучше использовать =внутри одиночного [ ], 'yes'технически не нужно заключать в кавычки (, даже если это не вредно ), и фигурные скобки { }не нужны для одной простой команды, все это делает эту версию лучше :

. ]
if [ "$a" = 1 ]; then echo yes; fi

Или, если вы решите использовать bash/ksh/zsh[[ ]]:

if [[ $a == 1 ]]; then echo yes; fi

И, наконец, тест с =или ==является сравнением строк, а не числовым, поэтому +1будет не равным 1, даже если они находятся в значении. Для численного тестирования вы можете использовать -eq.

4
22.03.2020, 22:18
if [ "$a" = 1 ]; then echo yes; fi

или

if test "$a" -eq 1 ; then echo yes; fi

или

if /usr/bin/test "$a" -eq 1;then echo yes;fi

Оболочка вырежет командную строку для проверки в полу -двоеточии (, а затем добавит аргументы в команду проверки -строку -argc/argv, если она не была встроенной -в)

Но это не работает:

if test "$a"-eq 1; then echo yes; fi

Где оболочка должна разделить аргументы для проверки? поэтому он не будет разбивать строку «+1 -eq 1»

То, что тест является отдельной программой, становится очевидным, если сделать это:

 sh:~$ LANG=C sh -c 'a=+1 ; if test "$a"-eq 1 ; then echo yes ; fi'
 sh: 1: test: +1-eq: unexpected operator

по сравнению с этим:

 sh:~$ LANG=C sh -c 'a=+1 ; if /usr/bin/test "$a"-eq 1;then echo yes;fi'
 /usr/bin/test: missing argument after '1'

Хм, разные сообщения об ошибках для одних и тех же аргументов для проверки...

0
23.03.2020, 02:14

Теги

Похожие вопросы