Соглашение Bash для если;затем - PullRequest
5 голосов
/ 02 ноября 2011

С этой веб-страницы:

http://tldp.org/LDP/abs/html/abs-guide.html

Упоминается использование условной скобки if, для которой требуется пробел после точки с запятой:

;

Command separator [semicolon]. Permits putting two or more commands on the same line.

echo hello; echo there


if [ -x "$filename" ]; then    #  Note the space after the semicolon.
#+                   ^^
  echo "File $filename exists."; cp $filename $filename.bak
else   #                       ^^
  echo "File $filename not found."; touch $filename
fi; echo "File test complete."

Note that the ";" sometimes needs to be escaped.

Кто-нибудь знает, откуда это исходит и нужно ли это вообще некоторым оболочкам?

Ответы [ 5 ]

12 голосов
/ 02 ноября 2011

Это стало стилем за последние несколько лет:

if [ -x "$filename" ]; then
   echo "hi"
fi

Однако, когда динозавры, такие как Берроуз и Сперри Рэнд, правили землей, я научился писать, если такие заявления:

if [ -x "$filename" ]
then
    echo "hi"
fi

Тогда вам даже не нужна точка с запятой.

Новый стиль с then в той же строке, что и if, начался для того, чтобы имитировать способ C и другиеязыки программирования сделали свои if операторы:

if (! strcmp("foo", "bar")) {
   printf "Strings equal\n";
}

Эти языки программирования помещают фигурную скобку на той же строке, что и if.

8 голосов
/ 02 ноября 2011

Точка с запятой ; - это оператор (а не ключевое слово , например, фигурные скобки { } или удар !) в Shell, поэтому его не нужноограниченный пробелом для распознавания в любой POSIX-совместимой оболочке.

Однако это улучшает читабельность (на мой вкус).

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

0 голосов
/ 03 ноября 2011

Я никогда не сталкивался с оболочкой, которая требовала пробела в этом контексте. Просто чтобы убедиться, я спросил на c.u.s., вы можете прочитать ответы здесь .

0 голосов
/ 02 ноября 2011

Я не верю, что там должно быть место.Нет ничего о том, что в спецификации POSIX sh .

требуются пробелы. Эмпирически следующее прекрасно работает как в bash 4.1.5 (1), так и в dash :

$ if true;then echo hi;else echo bye;fi
hi
$ 
0 голосов
/ 02 ноября 2011

Пробел после точки с запятой не требуется синтаксисом для какой-либо оболочки, о которой я знаю, но это хороший стиль и облегчает чтение кода.

Я полагаю, формулировка «иногда необходимо экранировать»относится к случаям типа echo foo\;bar, где вы не хотите, чтобы точка с запятой интерпретировалась оболочкой как разделитель.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...