Semikolons am Ende einer Zeile in Shell-Skripten überflüssig?

103

Ich habe ein Shell-Skript, das Folgendes enthält:

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;

Sind Semikolons im obigen Snippet völlig überflüssig? Und gibt es einen Grund für manche Leute, die doppelte Semikolons verwenden?

Es scheint, dass Semikolons nur ein Trennzeichen sind, etwas, das Sie anstelle einer neuen Zeile verwenden würden.

Nagel
quelle

Antworten:

150

Einzelne Semikolons am Ende einer Zeile sind überflüssig, da die neue Zeile auch ein Befehlstrennzeichen ist. casebenötigt speziell doppelte Semikolons am Ende des letzten Befehls in jedem Musterblock; siehe help casefür Details.

Ignacio Vazquez-Abrams
quelle
20
Toll! Wenn ich Sie also richtig verstehe, kann ich einzelne Semikolons am Ende einer Zeile sicher entfernen, aber niemals doppelte?
Nagel
29

Nach 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>

Das ;kann also ein Metazeichen oder ein Steuerungsoperator sein, während das ;;immer ein Steuerungsoperator ist (im Fallbefehl).

In Ihrem speziellen Code ;werden nicht alle am Ende der Zeile benötigt. Das ;;wird aber benötigt.

Michał Šrajer
quelle
4
Was ist dann der praktische Unterschied zwischen ;und ;;? Ich bin mit der Analyse der BASH-Syntax nicht vertraut genug, um den praktischen Unterschied zwischen dem, was BASH als "Metazeichen" bezeichnet, und dem, was es als "Steuerungsoperator" bezeichnet, zu kennen.
Jvriesem
1
stimme den Fragen und Kommentaren von jvriesem zu, das Docs-Snippet scheint etwas zu eng zu sein
grgry
6

Im speziellen Fall von find werden ;Befehle verwendet, die von -exec aufgerufen werden. Siehe die Antwort von @kenorb auf diese Frage .

DanielGKiel
quelle
0

@ Opensourcebook-Amit

Zeilenumbrüche, die einem einzelnen Semikolon ;am Terminal oder im Shell-Skript entsprechen.

Siehe die folgenden Beispiele:

Am Terminal:

[root@server test]# ls;pwd;

On Shell-Skript:

[root@server test]# cat test4.sh

echo "Current UserName:"
whoami

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

[root@server test]#

Ich bin jedoch nicht mit dem Kommentar einverstanden, der &einem Zeilenumbruch oder einem einzelnen Semikolon entspricht

& Befehle im Hintergrund auch als Befehlstrennzeichen ausführen, aber nicht als Semikolon oder Zeilenumbruch arbeiten.

Amit Ganvir
quelle
-2

@ Ignacio Vazquez-Abrams

Eigentlich ist das nicht ganz richtig, einzelne Semikolons am Ende einer Zeile sind nicht überflüssig und definitiv nicht dasselbe wie neue Zeilen.

Aus dem Bash-Referenzhandbuch

Befehle getrennt durch ein ';' werden nacheinander ausgeführt; Die Shell wartet darauf, dass jeder Befehl nacheinander beendet wird. Der Rückgabestatus ist der Beendigungsstatus des zuletzt ausgeführten Befehls.

Befehle , die von „neue Zeile“ getrennt werden könnten parallel ausgeführt , wenn Befehle , die durch Semikolons getrennt sind immer sequentiell ausgeführt

IJ
quelle
5
Das ist falsch. Es gibt keinen Unterschied. Wenn Sie denselben Abschnitt des Handbuchs richtig lesen, sehen Sie dies nur ein paar Zeilen weiter oben: A sequence of one or more newlines may appear in a list to delimit commands, equivalent to a semicolon.Was Sie also über das Semikolon zitiert haben, gilt auch für Zeilenumbrüche.
underscore_d
1
Ich stimme zu, dass dieser Satz mehrdeutig ist. Ich denke, der Autor meinte, dass ";" und "\ n" können beide mehrmals verwendet werden, um Befehle zu trennen, aber nicht, dass sie dasselbe tun. Ich habe diesen Link gefunden: unix.stackexchange.com/questions/53390/… Ich wusste das auch nicht, bevor ich tatsächlich ein Problem mit einem Skript hatte, das ich geschrieben habe und über den Unterschied zwischen ";" und "\ n" von einem meiner Kollegen. Leider ist das schon lange her und ich kann mich nicht erinnern, was es war, hier ein Beispiel zu posten.
IJ
2
Wenn Sie den Beitrag lesen würden, den Sie mit @IJ verlinkt haben, würden Sie sehen, dass die Parallelität von der &nicht der kommt \n. In einem Kommentar heißt es, er könne das Semikolon überspringen, da es anscheinend &auch ein Befehlstrennzeichen wie ;und ist \n.
Matthias