/ / Unterschied in der Bash zwischen IF-Anweisungen mit Klammern und eckigen Klammern - bash, if-Anweisung

Unterschied in Bash zwischen IF-Anweisungen mit Klammern und eckigen Klammern - bash, if-Anweisung

Während ich etwas darüber lerne Ich sehe vier Arten von Arbeitsweisen if Aussagen:

  • Einzelklammer - (...)
  • Doppelklammer - ((...))
  • Einzelwinkel - [...]
  • Doppelte quadratische Klammern - [[...]]

Was ist der Unterschied zwischen Klammern und Quadrat Klammern in bash.

Antworten:

56 für die Antwort № 1

Die Tests, die du aufgelistet hast:

  • Einzelklammer - (...) erstellt eine Unterschale
  • Doppelklammer - ((...)) steht für arithmetische Operation
  • Single Square Bracket - [...] ist die Syntax für das POSIX test
  • Double Square Brackets - [[...]] ist die Syntax für bash bedingte Ausdrücke (ähnlich wie test aber stärker)

sind nicht erschöpfend, können Sie verwenden Boolesche Logik

if command; then ...

Auch, weil die Befehle den Exit-Status haben. Im bash, 0 ist true und> 0 ist false.

Sie können den Exit-Status folgendermaßen sehen:

command
echo $?

Sehen :

http://wiki.bash-hackers.org/syntax/basicgrammar
http://wiki.bash-hackers.org/syntax/arith_expr
http://mywiki.wooledge.org/BashGuide/TestsAndConditionals


1 für die Antwort № 2

Die Shell selbst führt nur den Befehl aus und bewertet ihren Beendigungscode. Ein Null-Exit-Code bedeutet Erfolg; Alle anderen Werte weisen auf einen Fehler hin.

if command; then
: things to do if the exit code from command was 0
else
: things to do if it was not 0
fi

while command; do
: things to do if the exit code was 0
done

Der Befehl [ (aka test) wird sehr häufig in Konditionals verwendet, weilDer ursprünglichen Bourne-Shell fehlten integrierte Operatoren, um zu überprüfen, ob eine Zeichenfolge leer war oder eine Datei vorhanden war. Moderne Shells haben diesen Befehl eingebaut und viele Shells haben eine erweiterte und modernisierte Version [[, aber dies ist nicht richtig auf POSIX übertragbar sh und sollte daher für portable Skripte vermieden werden. Diese verwandte Frage erklärt die Unterschiede zwischen den beiden genauer.

Die Notation (( ... )) führt einen arithmetischen Kontext ein. Auch dies war etwas, das nicht Teil der ursprünglichen Bourne-Shell war (es hatte ein spezielles externes Tool) expr für diese Dinge), aber moderne Shells haben dies eingebaut. Der Ergebniscode eines arithmetischen Ausdrucks ist 0, wenn das Ergebnis der arithmetischen Auswertung nicht 0 (oder ein Fehler) war.

Die Notation ( command ) Erstellt eine Subshell und wertet sie aus command darin. Es gibt Situationen, in denen dies tatsächlich notwendig und nützlich ist, aber wenn Sie nur die Syntax lernen, ist es unwahrscheinlich, dass Sie diese benötigen.

... In der Tat, in den meisten Skripten habe ich gesehen, dass dies in einem bedingten verwendet wurde, war es eindeutig unnötig.

Ein anderes Antipattern, auf das man achten sollte, ist

command
if [ $? = 0 ]; then
: things
fi

Sie sollten fast nie untersuchen müssen $? explizit, und insbesondere, es mit Null zu vergleichen ist etwas if und while speziell Mach für dich hinter den Kulissen. Dies sollte einfach umgestaltet werden

if command; then
: ...