Semikolon in bedingten Strukturen

34

Warum Semikolons in eines und nicht in ein anderes einfügen?

Das Ergebnis ist das gleiche

Code eins

if [ "a" == "a" ]
then
 echo "true"
fi

Code zwei

if [ "a" == "a" ];
then
 echo "true";
fi

Semikolons im zweiten Code sind unnötig?

Wann müssen Semikolons gesetzt werden?

Jhonathan
quelle
2
Dies wurde ausreichend und richtig beantwortet, aber ich wollte das OP auch darüber informieren; Ersetzt einfach ein Zeilenende, sodass Sie zwei Befehle in einer Zeile kombinieren können, z. B .:svn up; make
Aaron D. Marasco
1
Beachten Sie auch, dass ;;in case-Anweisungen zwei Semikolons verwendet werden, um Übereinstimmungen zu trennen. ;;wird hier benötigt, nicht optional .... ist aber ;;nicht dasselbe wie ;oder ; ;, es sieht nur ein bisschen so aus. Einzelne Semikolons ;funktionieren wie gewohnt in den COMMANDS-Teilen einer case-Anweisung.
cas

Antworten:

30

Das Semikolon wird nur benötigt, wenn das Zeilenende fehlt:

if [ "a" == "a" ] ; then echo "true" ; fi

Ohne Semikolon erhalten Sie einen Syntaxfehler.

Ich verstehe Ihre Frage zu Anführungszeichen nicht. Kannst du genauer sein?

(Übrigens ist die Verwendung von =statt ==portabler und POSIX-konformer).

Choroba
quelle
Anführungszeichen im zweiten Code sind unnötig?
Jhonathan
2
Alle Anführungszeichen in beiden Beispielen sind nicht zutreffend.
Choroba
6

Das Semikolon wird oft verwendet, weil einige Leute (/ ich zB) einen Stil wie diesen mögen:

if [ ... ]; then
   doit-it-then
else
   doit-it-else
fi

Wenn also das then-Schlüsselwort in die Bedingungszeile gestellt wird, ist es erforderlich, da ein neuer Befehl gestartet wird, wie er von choroba geschrieben wurde.

Was die Anführungszeichen in der Bedingungsprüfung betrifft, werden sie häufig mit Variablen verwendet, um sicherzustellen, dass keine Ausnahme auftritt, wenn der Variablen nichts zugewiesen ist. Dies ist ein sicherer Stil und sieht unnötig aus, aber selbst bei der Shell-Programmierung hat es von Zeit zu Zeit dazu geführt, dass Programme verarbeitet werden, obwohl der Inhalt keinen Variablen zugewiesen werden konnte. Dann funktioniert der Befehl immer noch, da eine leere Zeichenfolge verglichen wird.

Wolf
quelle