Точки з комою зайвими в кінці рядка в скриптах оболонки?


103

У мене є сценарій оболонки, який містить наступне:

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;

Чи є крапки з комою повністю зайвими у фрагменті вище? І чи є причина, що деякі люди використовують подвійні крапки з комою?

Здається, крапки з комою є лише роздільником, що б ви використовували замість нового рядка.

Відповіді:


150

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


20
Чудово! Отже, якщо я вас правильно зрозумів, я можу сміливо видалити будь-які одиничні крапки з комою в кінці будь-якого рядка, але ніколи не подвійні?
Нагель

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

У спеціальному випадку знаходження ;використовується для завершення команд, на які посилається -exec. Дивіться відповідь @kenorb на це запитання .


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

Команди, розділені знаком ';' виконуються послідовно; оболонка чекає, коли кожна команда по черзі закінчиться. Статус повернення - це стан виходу останньої виконаної команди.

Команди, розділені "новим рядком", можуть виконуватися паралельно, коли команди, розділені крапкою з комою, завжди виконуються послідовно


5
Це помилково. Різниці немає. Якщо ви правильно прочитали той самий розділ посібника, ви побачите це лише через кілька рядків: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.Отже, те, що ви цитували про крапку з комою, відноситься однаково до нових рядків.
підкреслюй_d

1
Я згоден, що це речення неоднозначне, я думаю, що автор мав на увазі те, що ";" і "\ n" можна використовувати не раз для розділення команд, але не те, що вони роблять те саме. Я знайшов це посилання: unix.stackexchange.com/questions/53390/… Я також не знав цього, перш ніж у мене справді виникли проблеми з якимось сценарієм, який я написав, і було відмічено про різницю між ";" і "\ n" одним моїм колегою. На жаль, це було давно, і я не можу пригадати, що це було, щоб розмістити приклад тут.
IJ

2
якби ви прочитали пост, який ви пов’язали з @IJ, ви побачили, що паралелізм походить від &не \n. У коментарі зазначається, що він може пропустити крапку з комою, оскільки, мабуть, &також є роздільником команд так само, як ;і \n.
Маттіас
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.