Лишние точки с запятой в конце строки в сценариях оболочки?

104

У меня есть сценарий оболочки, который содержит следующее:

case $1 in
    0 )
    echo $1 = 0;
    OUTPUT=3;;
    1 )
    echo $1 = 1;
    OUTPUT=4;;
    2 )
    echo $1 = 2;
    OUTPUT=4;;
esac

HID=$2;
BUNCH=16;
LR=.008;

Точки с запятой в приведенном выше фрагменте совершенно излишни? И есть ли причина, по которой некоторые люди используют двойную точку с запятой?

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

Нагель
источник

Ответы:

152

Одиночные точки с запятой в конце строки излишни, так как новая строка также является разделителем команд. caseв частности, требуется двойная точка с запятой в конце последней команды в каждом блоке шаблона; подробнее см help case.

Игнасио Васкес-Абрамс
источник
20
Большой! Итак, если я вас правильно понял, я могу безопасно удалить любые одиночные точки с запятой в конце любой строки, но никогда не двойные?
Nagel
29

По данным man bash:

  metacharacter
         A character that, when unquoted, separates words.  One of the following:
         |  & ; ( ) < > space tab
  control operator
         A token that performs a control function.  It is one of the following symbols:
         || & && ; ;; ( ) | |& <newline>

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

В вашем конкретном коде все ;в конце строки не нужны. Однако ;;необходимо.

Михал Шрайер
источник
4
В чем же тогда практическая разница между ;и ;;? Я недостаточно знаком с синтаксическим анализом BASH, чтобы понимать практическую разницу между тем, что BASH называет «метасимволом», и тем, что он называет «оператором управления».
jvriesem
1
согласен с вопросами и комментариями jvriesem, фрагмент документации кажется слишком узким
grgry
6

В особом случае find ;используется для завершения команд, вызываемых -exec. Смотрите ответ @kenorb на этот вопрос .

DanielGKiel
источник
0

@ Opensourcebook-Amit

новые строки эквивалентны одиночной точке с запятой ;в терминале или в сценарии оболочки.

См. Примеры ниже:

На терминале:

[root@server test]# ls;pwd;

В сценарии оболочки:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

echo -e "\nCurrent Date:";date;

[root@server test]#

Но я не согласен с комментарием, который &эквивалентен новой строке или одной точке с запятой.

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

Амит Ганвир
источник
-2

@ Игнасио Васкес-Абрамс

На самом деле это не совсем точно, точки с запятой в конце строки не являются лишними и определенно не то же самое, что новые строки.

Из справочного руководства Bash

Команды, разделенные знаком ";" выполняются последовательно; оболочка ждет по очереди завершения каждой команды. Статус возврата - это статус выхода последней выполненной команды.

Команды, разделенные «новой строкой», могут выполняться параллельно, если команды, разделенные точкой с запятой, всегда выполняются последовательно.

IJ
источник
5
Это неправда. Нет никакой разницы. Если вы внимательно прочитаете тот же раздел руководства, вы увидите это, всего несколькими строками выше: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.Итак, то, что вы процитировали о точке с запятой, в равной степени применимо к новым строкам.
underscore_d
1
Я согласен с тем, что это предложение неоднозначно, я думаю, что автор имел в виду, что ";" и "\ n" могут использоваться более одного раза для разделения команд, но это не значит, что они делают одно и то же. Я нашел эту ссылку: unix.stackexchange.com/questions/53390/… Я также не знал этого до того, как у меня действительно возникла проблема с написанным мной скриптом, и я заметил разницу между ";" и "\ n" одним из моих коллег. К сожалению, это было давно, и я не могу вспомнить, что это было, чтобы разместить здесь пример.
IJ
2
если бы вы читали этот пост вы связаны с @IJ вы бы увидели , что параллелизм происходит от &не \n. В комментарии говорится, что он может пропустить точку с запятой, потому что, по-видимому, &он также является разделителем команд, как ;и \n.
Матиас