case ist eine Verzweigungstyp, der verschachtelte if Statements auflösen und den Scriptcode übersichtlicher machen kann.

Ein einfaches Beispiel für verschachtelte ifs soll folgendes Programm zeigen, dass den per Kommandozeilenparameter übergebenen Vornamen dem richtigen Familiennamen aus die Simpsons zuordnet. Damit das nicht zu umfangreich ist, beschränken ich mich auf die Familien „Simpson“, „Flanders“ und „Wiggum“.
verschachtelte if Statements
Hier zunächst mal die Ausgangslage.
#!/usr/bin/bash
# Datei teil23/family_if.sh
if [[ "${1}" == "Homer" || "${1}" == "Marge" || "${1}" == "Bart" || "${1}" == "Lisa" ]]; then
echo "Familie Simpson"
elif [[ "${1}" == "Ned" || "${1}" == "Maude" || "${1}" == "Todd" || "${1}" == "Rod" ]]; then
echo "Familie Flanders"
elif [[ "${1}" == "Clancy" || "${1}" == "Sarah" || "${1}" == "Ralph" ]]; then
echo "Familie Wiggum"
else
echo "unbekannte Familie"
fi
Die geschachtelten ifs testen die Vornamen der drei Familien über ein logisches OR ||
miteinander. Wenn keine der Bedingungen des ersten if wahr ist, wird mit dem nächsten if weiter gemacht und so fortgefahren. Das abschließende else dient zur Ausgabe bei einem unbekannten Vornamen.
Beim Aufruf von ./family_if.sh kannst du jetzt verschiedene Namen alle möglichen Zweige testen.

Dieses Script tut zwar genau das, was es soll. Hat aber zwei Probleme. Es sieht unschön aus und ist ggf. schwer wartbar. Stell dir vor, der Name wird nicht mehr im ersten Parameter übergeben sondern im zweiten. Dann musst du an 11 Stellen die Variable ändern und unnötige Arbeit wollen wir uns ja ersparen.
Deshalb zeige ich dir jetzt eine sehr viel elegantere Lösung.
case Statement
Das case Statement der bash fasst vereinfacht gesagt, alle obigen Zweige zu einer einzigen Abfrage zusammen.
#! /usr/bin/bash
#Datei: teil23/family_case.sh
case ${1} in
'Homer'|'Marge'|'Bart'|'Lisa') # Familie Simpson
echo "Familie Simpson"
;;
'Ned'|'Maude'|'Todd'|'Rod') # Familie Flanders
echo "Familie Flanders"
;;
'Clancy'|'Sarah'|'Ralph') # Familie Wiggum
echo "Familie Wiggum"
;;
*) # default
echo "unbekannte Familie"
;;
esac
Auch dieses Script ist schnell getestet.

Auch dem ungeübten Auge erschließt sich der Syntax sehr schnell. case ${1
} fragt die Variable ab und die möglichen Werte sind in den Blöcken wie
'Clancy'|'Sarah'|'Ralph')
Kommandos
;;
In jedem Block können mehrere Kommandos ausgeführt werden. Das Ende eines Blocks wird immer mit einem doppelten Semikolon ;;
gekennzeichnet. Eine Besonderheit ist der *)
Zweig. Dies ist der Default Zweig, der immer dann ausgeführt wird, wenn keine der Bedingungen der vorherigen Zweige zutraf.
Dir fällt vielleicht auf, das case nur ein einzelnes | zwischen den Werten verwendet, if aber zwei. Dies liegt daran, dass bei if mehrere Vergleichsoperationen durch ein logisches Oder verknüpft sind, Bei case wird in jedem Zweig eine Musterliste angegeben, gegen die ${1} getestet wird.
Die beiden Scriptversionen sind verhaltensäquivalent und funktional gleichwertig. Allerdings ist die case
Variante deutlich besser lesbar.
Wie ich case
in einem praktischen Beispiel verwende, zeige ich dir demnächst.