bash Scripting case – Tutorial Teil 23

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

Dr. Dirk Colbry, Michigan State
Gnu-bash-logoCreative Commons Attribution-NonCommercial-ShareAlike 4.0 International License . loading=
1Einführung
2Der bash Prompt
3key bindings
4Der Startvorgang
5Environment Variablen
6builtin commands
7Arbeiten mit Dateien
8nano
9bash Scripting
10Variablen
11Verzweigungen (if)
12Schleifen
13Kommandozeilenparameter
14exit Codes bash Tutorial Teil 14
15von der Idee zum Script
16grep
17Piping und Redirection
18tee
19alias
20Der Shebang
21Das sed Kommando
22cd Kommando
23case Verzweigungen

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.

Test aller Zweige von family_if.sh

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.

Test aller Zweige von family_case.sh
Test aller Zweige von family_case.sh

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.

Schreibe einen Kommentar

Insert math as
Block
Inline
Additional settings
Formula color
Text color
#333333
Type math using LaTeX
Preview
\({}\)
Nothing to preview
Insert
Creative Commons License
Except where otherwise noted, the content on this site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.
Olli Graf - raspithek.de
WordPress Cookie Hinweis von Real Cookie Banner