Rheinwerk Computing < openbook > Rheinwerk Computing - Professionelle Bücher. Auch für Einsteiger.
Professionelle Bücher. Auch für Einsteiger.

 << zurück
Shell-Programmierung von Jürgen Wolf
Einführung, Praxis, Referenz
Buch: Shell-Programmierung

Shell-Programmierung
782 S., mit CD, 44,90 Euro
Rheinwerk Computing
ISBN 3-89842-683-1
gp Kapitel 4 Kontrollstrukturen
  gp 4.1 Bedingte Anweisung mit if
    gp 4.1.1 Kommandos testen mit if
    gp 4.1.2 Kommandoverkettung über Pipes mit if
  gp 4.2 Die else-Alternative für eine if-Verzweigung
  gp 4.3 Mehrfache Alternative mit elif
  gp 4.4 Das Kommando test
    gp 4.4.1 Ganze Zahlen vergleichen
    gp 4.4.2 Ganze Zahlen vergleichen mit let (Bash und Korn-Shell only)
    gp 4.4.3 Zeichenketten vergleichen
    gp 4.4.4 Zeichenketten vergleichen (Bash und Korn-Shell only)
  gp 4.5 Status von Dateien erfragen
  gp 4.6 Logische Verknüpfung von Ausdrücken
    gp 4.6.1 Negationsoperator !
    gp 4.6.2 Die UND-Verknüpfung (-a und &&)
    gp 4.6.3 Die ODER-Verknüpfung (-o und ||)
    gp 4.6.4 Klammerung und mehrere logische Verknüpfungen
  gp 4.7 Short Circuit-Tests – ergebnisabhängige Befehlsausführung
  gp 4.8 Die Anweisung case
    gp 4.8.1 Alternative Vergleichsmuster
    gp 4.8.2 case und Wildcards
    gp 4.8.3 case und Optionen
  gp 4.9 Schleifen
  gp 4.10 for-Schleife
    gp 4.10.1 Argumente bearbeiten mit for
    gp 4.10.2 for und die Dateinamen-Substitution
    gp 4.10.3 for und die Kommando-Substitution
    gp 4.10.4 for und Array (Bash und Korn Shell only)
    gp 4.10.5 for-Schleife mit Schleifenzähler (Bash only)
  gp 4.11 Die while-Schleife
  gp 4.12 Die until-Schleife
  gp 4.13 Kontrollierte Sprünge
    gp 4.13.1 Der Befehl continue
    gp 4.13.2 Der Befehl break
  gp 4.14 Endlosschleifen


Rheinwerk Computing

4.7 Short Circuit-Tests – ergebnisabhängige Befehlsausführuntoptop

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.


Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 4.8   Ereignisabhängige Befehlsausführung (UND-Verknüpfung)



Abbildung
Hier klicken, um das Bild zu Vergrößern

Abbildung 4.9   Ereignisabhängige Befehlsausführung (ODER-Verknüpfung)


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.

 << zurück
  
  Zum Rheinwerk-Shop
Zum Rheinwerk-Shop: Shell-Programmierung
Shell-Programmierung
bestellen
 Buchtipps
Zum Rheinwerk-Shop: Shell-Programmierung






 Shell-Programmierung


Zum Rheinwerk-Shop: Linux-Server






 Linux-Server


Zum Rheinwerk-Shop: Das Komplettpaket LPIC-1 & LPIC-2






 Das Komplettpaket
 LPIC-1 & LPIC-2


Zum Rheinwerk-Shop: Linux-Hochverfügbarkeit






 Linux-
 Hochverfügbarkeit


Zum Rheinwerk-Shop: Linux Handbuch






 Linux Handbuch


 Lieferung
Versandkostenfrei bestellen in Deutschland, Österreich und der Schweiz
InfoInfo





Copyright © Rheinwerk Verlag GmbH 2005
Für Ihren privaten Gebrauch dürfen Sie die Online-Version natürlich ausdrucken. Ansonsten unterliegt das Openbook denselben Bestimmungen, wie die gebundene Ausgabe: Das Werk einschließlich aller seiner Teile ist urheberrechtlich geschützt.
Alle Rechte vorbehalten einschließlich der Vervielfältigung, Übersetzung, Mikroverfilmung sowie Einspeicherung und Verarbeitung in elektronischen Systemen.


Nutzungsbestimmungen | Datenschutz | Impressum

Rheinwerk Verlag GmbH, Rheinwerkallee 4, 53227 Bonn, Tel.: 0228.42150.0, Fax 0228.42150.77, service@rheinwerk-verlag.de

Cookie-Einstellungen ändern