4.7 Short Circuit-Tests – ergebnisabhängige Befehlsausführung
 
Eine sehr interessante Besonderheit vieler Skriptsprachen besteht darin, dass man die logischen Operatoren nicht nur für Ausdrücke verwenden kann, sondern auch zur logischen Verknüpfung von Anweisungen. So wird zum Beispiel bei einer Verknüpfung zweier Anweisungen mit dem ODER-Operator || die zweite Anweisung nur dann ausgeführt, wenn die erste fehlschlägt. Ein einfaches Beispiel in der Kommandozeile:
you@host > rm afile 2>/dev/null || \
> echo "afile konnte nicht gelöscht werden"
afile konnte nicht gelöscht werden
Kann im Beispiel die Anweisung rm nicht ausgeführt werden, wird die Anweisung hinter dem ODER-Operator ausgeführt. Ansonsten wird eben nur rm zum Löschen der Datei afile ausgeführt. Man spricht hierbei von der Short-Circuit-Logik der logischen Operatoren. Beim Short-Circuit wird mit der Auswertung eines logischen Operators aufgehört, sobald das Ergebnis feststeht. Ist im Beispiel oben der Rückgabewert von rm wahr (0), steht das Ergebnis bei einer ODER-Verknüpfung bereits fest. Ansonsten, wenn der erste Befehl einen Fehler (ungleich 0) zurückliefert, wird im Fall einer ODER-Verknüpfung die zweite Anweisung ausgeführt – im Beispiel die Fehlermeldung mittels echo. Man nutzt also hier schlicht den Rückgabewert von Kommandos aus, den man benutzt, um Befehle abhängig von deren Ergebnis miteinander zu verknüpfen.
In Tabelle 4.11 finden Sie die Syntax der ereignisabhängigen Befehlsausführung:
Tabelle 4.11
Ereignisabhängige Befehlsausführung (Short-Circuit-Test)
Verknüpfung
|
Bedeutung
|
befehl1 && befehl2
|
Hier wird befehl2 nur dann ausgeführt, wenn der befehl1 erfolgreich ausgeführt wurde, sprich den Rückgabewert 0 zurückgegeben hat.
|
befehl1 || befehl2
|
Hier wird befehl2 nur dann ausgeführt, wenn beim Ausführen von befehl1 ein Fehler auftrat, sprich einen Rückgabewert ungleich 0 zurückgegeben hat.
|
Das Ganze dürfte Ihnen wie bei einer if-Verzweigung vorkommen. Und in der Tat können Sie dieses Konstrukt als eine verkürzte if-Verzweigung verwenden. Bspw.:
befehl1 || befehl2
entspricht
if befehl1
then
# Ja, befehl1 ist es
else
befehl2
fi
Und die ereignisabhängige Verknüpfung
befehl1 && befehl2
entspricht folgender if-Verzweigung:
if befehl1
then
befehl2
fi
Ein einfaches Beispiel:
you@host > ls atestfile.txt > /dev/null 2>&1 && vi atestfile.txt
Hier »überprüfen« Sie praktisch, ob die Datei atestfile.txt existiert. Wenn diese existiert, gibt die erste Anweisung 0 bei Erfolg zurück, somit wird auch die zweite Anweisung ausgeführt. Dies wäre das Laden der Textdatei in den Editor vi. Dies können Sie nun auch mit dem test-Kommando bzw. seiner symbolischen Form verkürzen:
you@host > [ -e atestfile.txt ] && vi atestfile.txt
Diese Form entspricht dem Beispiel zuvor. Solche Dateitests werden übrigens sehr häufig in den Shellscripts eingesetzt. Natürlich können Sie hierbei auch eine Flut von && und || starten. Aber aus Übersichtlichkeitsgründen sei von Übertreibungen abgeraten. Meiner Meinung nach wird es bei mehr als drei Befehlen recht unübersichtlich.
you@host > who | grep tot > /dev/null && \
> echo "User tot ist aktiv" || echo "User tot ist nicht aktiv"
User tot ist aktiv
Dieses Beispiel ist hart an der Grenze des Lesbaren. Bitte überdenken Sie das, wenn Sie anfangen, ganze Befehlsketten-Orgien auszuführen. Im Beispiel haben Sie außerdem gesehen, dass Sie auch && und || mischen können. Aber auch hier garantiere ich Ihnen, dass Sie bei wilden Mixturen schnell den Überblick verlieren werden. Das Verfahren wird auch sehr gern zum Beenden von Shellscripten eingesetzt:
# Datei lesbar... wenn nicht, beenden
[ -r $file ] || exit 1
# Datei anlegen ... wenn nicht, beenden
touch $file || [ -e $file ] || exit 2
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|