Der Operator && führt den nächsten Befehl aus, wenn der vorherige Befehl erfolgreich ausgeführt wurde (zurückgegebener Exit-Code ($?) 0 = logisch wahr).
In Form A && B || C
wird der Befehl (oder die Bedingung) A ausgewertet, und wenn A true zurückgibt (Erfolg, Beendigungscode 0), wird der Befehl B ausgeführt. Wenn A fehlschlägt (so kehrt falsche - Beendigungscode ungleich 0) und / oder B fehlschlägt (Rückkehr falsch ) , dann Befehl C wird ausgeführt.
Der &&
Operator wird auch als UND in Bedingungsprüfungen verwendet, und der Operator ||
arbeitet wie ODER in Bedingungsprüfungen.
Abhängig davon, was Sie mit Ihrem Skript tun möchten, A && B || C
kann form für Bedingungsprüfungen wie in Ihrem Beispiel verwendet werden oder zum Verketten von Befehlen und zum Ausführen einer Reihe von Befehlen, wenn vorherige Befehle den erfolgreichen Beendigungscode 0 hatten .
Aus diesem Grunde ist es üblich , Befehle zu sehen , wie:
do_something && do_something_else_that_depended_on_something
.
Beispiele:
apt-get update && apt-get upgrade
Wenn das Update fehlschlägt, wird das Upgrade nicht ausgeführt (in der Praxis sinnvoll ...).
mkdir test && echo "Something" > test/file
Der Teil echo "Something"
wird nur ausgeführt, wenn der mkdir test
Vorgang erfolgreich war und der Beendigungscode 0 zurückgegeben wurde .
./configure --prefix=/usr && make && sudo make install
Wird normalerweise beim Kompilieren von Jobs zum Verketten der erforderlichen abhängigen Befehle verwendet.
Wenn Sie versuchen , über „Ketten“ mit zu implementieren , wenn - dann - sonst müssen Sie viel mehr Befehle und überprüft (und damit mehr Code zu schreiben - mehr Dinge schief gehen) für eine einfache Aufgabe.
Beachten Sie auch, dass Befehle mit && und || verkettet sind werden von Shell von links nach rechts gelesen. Möglicherweise müssen Sie Befehle und Bedingungsprüfungen in Klammern gruppieren, um den nächsten Schritt von der erfolgreichen Ausgabe einiger vorheriger Befehle abhängig zu machen. Zum Beispiel siehe dies:
root@debian:$ true || true && false;echo $?
1
#read from left to right
#true OR true=true AND false = false = exit code 1=not success
root@debian:$ true || (true && false);echo $?
0
# true OR (true AND false)=true OR false = true = exit code 0 = success
Oder ein reales Beispiel:
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 ]] && [[ $c -eq 2 ]];echo $?
1
#condition $a = true OR condition b = true AND condition $c = false
#=> yields false as read from left to right, thus exit code=1 = not ok
root@debian:$ a=1;b=1;c=1;[[ $a -eq 1 ]] || [[ $b -eq 1 && $c -eq 2 ]];echo $?
0
#vars b and c are checked in a group which returns false,
#condition check of var a returns true, thus true OR false yields true = exit code 0
Beachten Sie, dass einige Befehle verschiedenen Exit - Codes in Abhängigkeit von dem Prozess ausgeführt zurückzukehren, oder kehren verschiedene Codes in Abhängigkeit von ihren Aktionen (zum Beispiel Befehl GNU diff
, kehren 1 , wenn zwei Dateien unterscheiden, und 0 , wenn sie es nicht tun). Solche Befehle müssen in && und || mit Sorgfalt behandelt werden .
Beachten Sie auch die Verkettung von Befehlen mithilfe des ;
Operators , um alle Rätsel zusammen zu haben . Bei einem Format werden A;B;C
alle Befehle unabhängig vom Exit-Code von command A
und in Serie ausgeführt B
.