11.5 Bedingte Anweisungen
Auch in der Shell können bedingte Anweisungen verwendet werden. Wir werden uns im Folgenden die bereits aus awk in ähnlicher Form bekannte if-Anweisung und später die case-Anweisung ansehen.
11.5.1 if
Die bedingte Anweisung, die man am häufigsten verwendet, ist if. Sie hat einen einfachen Aufbau: Hinter dem if-Befehl selbst folgt die in der Regel in eckigen Klammern eingeschlossene Bedingung, wobei man stets darauf achten sollte, die nötigen Leerzeichen um die eckigen Klammern zu setzen. Darauf folgt das Schlüsselwort then, das die Anweisungen einleitet, die abgearbeitet werden sollen, sofern die Bedingung erfüllt ist.
elif
Ist die erste Bedingung nicht erfüllt, wird – sofern vorhanden – die mit elif angehängte nächste Bedingung geprüft. Ist auch diese nicht erfüllt, werden die restlichen elif-Bedingungen so lange überprüft, bis entweder eine davon erfüllt oder keine weitere elif-Bedingung mehr vorhanden ist.
else
Ist keine Bedingung erfüllt, werden – sofern vorhanden – die Anweisungen hinter dem else-Schlüsselwort ausgeführt.
fi
Die if-Anweisung wird durch das Schlüsselwort fi beendet.
Listing 11.19 Die if-Anweisung
if [ Bedingung ]
then
Anweisung1
Anweisung2
...
elif [ Bedingung2 ]
then
Anweisung1
Anweisung2
...
elif [ BedingungN ]
then
Anweisung1
Anweisung2
...
else
Anweisung1
Anweisung2
...
fi
Eine if-Anweisung muss weder eine elif- noch eine else-Anweisung beinhalten.
Es ist auch möglich, den Skriptcode für eine if-Anweisung in einer zeilensparenden und gleichzeitig übersichtlicheren Form zu schreiben, sofern man trennende Semikola verwendet. [Fn. Man kann auch die komplette if-Anweisung inklusive sämtlicher Sub-Bedingungen und Anweisungen in eine einzelne Zeile, separiert durch Semikola, schreiben. Dies ist allerdings sehr unübersichtlich und soll nur der Vollständigkeit halber erwähnt werden.] Diese Methode werden wir in den restlichen Beispielen dieses Kapitels anwenden.
Listing 11.20 if kürzer fassen
if [ Bedingung ]; then
Anweisung1
Anweisung2
...
elif [ Bedingung2 ]; then
Anweisung1
Anweisung2
...
elif [ BedingungN ]; then
Anweisung1
Anweisung2
...
else
Anweisung1
Anweisung2
...
fi
Die Klammern
Wirft man einen Blick in das Dateisystem, so wird man beispielsweise unter OpenBSD im Verzeichnis /bin den Dateinamen [ vorfinden. Dabei handelt es sich um ein ausführbares Programm namens test. Tatsächlich ist die Syntax der if-Anweisung in der folgenden Form aufgebaut:
Listing 11.21 Die if-Anweisung: korrekte Syntax
if Testbefehl; then
Anweisungen
fi
Das Programm test erlaubt uns nun, eine Bedingung zu erstellen. Ist diese Bedingung erfüllt, gibt test wahr bzw. im anderen Fall falsch an if zurück. Sie können jedoch auch jedes andere Programm in eine if-Anweisung einbauen:
Listing 11.22 Das Programm »test« in Verbindung mit der if-Anweisung
$ if test 1
then
echo "Test"
fi
Test
$ if /bin/ls >/dev/null
then
echo "Test"
fi
Test
$ if /bin/gibtsnicht
then
echo "blah"
else
echo "Fehler"
fi
bash: /bin/gibtsnicht: No such file or directory
Fehler
Zahlen-Vergleiche
Doch nun zurück zu den eigentlichen Bedingungen, die uns das Programm test bietet. Zunächst werden wir uns ansehen, wie Vergleiche zwischen Zahlenwerten programmiert werden, wofür es verschiedene Möglichkeiten gibt. Wir werden uns mit der einfachsten und unserer Meinung nach besten davon beschäftigen. Dabei verwendet man vier runde an Stelle zweier eckiger Klammern und die bereits aus awk bekannten Vergleichsoperatoren ==, != oder =>:
Listing 11.23 Zahlenvergleich
if (( 17 < 20 ))
then
echo "17 ist kleiner als 20"
else
echo "hier stimmt irgendetwas nicht..."
fi
String-Vergleiche
Möchte man hingegen Strings vergleichen, so gilt hier, dass man bei diesen auch reguläre Ausdrücke einbauen kann. Ein String wird dabei in Anführungszeichen gesetzt, was auch für Variablen gilt.
Listing 11.24 Strings vergleichen
# direkter Stringvergleich:
if [ "abc" = "abc" ]; then
echo "Bedingung ist wahr."
fi
# Variablen mit Strings
A="abc"
if [ "$A" = "abc" ]; then
echo "Bedingung ist wahr."
fi
# reguläre Ausdrücke (Achtung: Doppelklammer!)
if [[ "$A" == a?? ]]; then
echo "Bedingung ist wahr."
fi
11.5.2 case
Mit case stellt die Shell jedoch noch eine Option zur Verfügung, mit der eine bedingte Anweisung in Skripts eingebaut werden kann. Hierbei werden die möglichen »Fälle«, die eintreten können, explizit angegeben, was in folgender Form geschieht, wobei Testwert in der Regel der Wert einer Variablen ist:
Listing 11.25 case
case Testwert in
Fall1)
Anweisung1;
Anweisung2;
;;
Fall2)
Anweisung1;
Anweisung2;
;;
esac
else für case
Das von der if-Anweisung bekannte else-Schlüsselwort finden wir in ähnlicher Form (nämlich als Fall *) auch für die case-Anweisung vor. Dieser enthält die Anweisungen, die ausgeführt werden sollen, wenn keiner der zuvor aufgeführten Fälle eintritt.
Ein Anweisungsblock für einen Fall ist durch zwei Semikola abzuschließen.
[zB]Im folgenden Beispiel soll gezeigt werden, wie der *)-Fall und die Abschlusssequenz angewandt werden.
Listing 11.26 case-Beispiel
ZAHL=5
case $ZAHL in
3)
echo "Die Zahl ist 3!"
;;
4)
echo "Die Zahl ist 4!"
;;
*)
echo "Zahl ist nicht 3 oder 4!"
;;
esac
Etwas kompakter
Möchte man nicht für jeden Fall, für den ähnlicher oder gar gleicher Skriptcode ausgeführt werden soll, den Anweisungsblock neu schreiben, kann man sich Arbeit ersparen und sogar einen übersichtlicheren Code erstellen, indem man Bedingungen zusammenfasst. Dazu verwendet man die ODER-Verknüpfung. Ein Fall ist dann erfüllt, wenn zumindest eine einzige der angegebenen Möglichkeiten zutrifft.
Listing 11.27 Die kompakte Version
ZAHL=3
case $ZAHL in
3|4)
echo "Die Zahl ist 3 oder 4!"
;;
*)
echo "Zahl ist nicht 3 oder 4!"
;;
esac
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.