Teil 5: Kontrollstrukturen die Zweite

Checkpoint Charlie

Nach der Einführung in die Kontrollstrukturen und Vorstellung von einfachen Vergleichsmöglichkeiten im letzten Teil beschäftigen wir uns diesmal mit Reihenvergleichen, Schleifen, Tastatureingaben und kleinen Auswahlmenüs.

In der letzten Ausgabe haben Sie die if-Konstruktion und das Vergleichsprogramm test kennengelernt. Damit war es uns erstmals möglich, den Programmablauf von äußeren Umständen abhängig zu machen; je nach Situation wurden andere Befehle ausgeführt. Die Bash kennt noch weitere Kontrollstrukturen, die insbesondere bei umfangreichen Vergleichen und zum mehrfachen Aufruf einzelner Befehle benötigt werden (Schleifen).

Parametererkennung

Beginnen wollen wir mit einem kleinen Skript. Wie fast jedes andere Linux-Programm soll unser Skript mittels Parameter -h oder --help eine kurze Erklärung der erlaubten Optionen ausgeben und sich dann beenden. Dazu verwenden wir ein if-Konstrukt, wie Sie es im letzten Teil kennen gelernt haben:

#!/bin/bash
 if [ "$1" = "-h" -o "$1" = "--help" ]; then
   echo "Aufruf:"
   echo "  $0 [-h|--help]"
   echo "Parameter:"
   echo "  -h, --help: Kurzerklärung"
 fi

Relativ umständlich und unübersichtlich wird es, wenn wir mehrere Parameter überprüfen müssen und zudem Groß-/Kleinschreibung ignorieren wollen:

#!/bin/bash
 if [ "$1" = "-h" -o "$1" = "-H" -o -z "${1#--[hH][eE][lL][pP]}" ]; then
   echo "-h"
 elif [ "$1" = "-v" -o "$1" = "-V" ]; then
   echo "-v"
 elif [ "$1" = "-q" -o "$1" = "-Q" ]; then
   echo "-q"
 fi

Der Test auf --help in der zweiten Zeile ist erklärungsbedürftig. Um nicht auf --help in allen Varianten der Groß-/Kleinschreibung zu prüfen, verwenden wir die Mustererkennung aus Teil 3 unsers Kurses. Mit ${1#--[hH][eE][lL][pP]} durchsuchen wir die Variable $1 nach einem String, der mit einem Doppel-Minus beginnt und dann ein großes oder kleines H, großes oder kleines E und so weiter enthält. Ist in $1 tatsächlich --help in einer beliebigen Groß-/Klein-Kombination enthalten, wird es entfernt – übrig bleibt eine leere Zeichenkette. Hier kommt der Test-Parameter -z ins Spiel: Er liefert dann einen wahren Wert, wenn die dahinter stehende Zeichenkette leer ist – also eine Version von --help gefunden wurde. Worte, die nur mit --help beginnen (zum Beispiel --helper) fallen beim Test durch, weil die Endung übrig bleiben würde.

Vereinfachung mit <C>case<C>

Wie am vorhergehenden Beispiel zu sehen: Umfangreiche Parameter-Prüfungen kann man so kaum durchführen. Vereinfachung tut Not. Das Vorgehen beim Parameter-Vergleich ist stets gleich: Wir prüfen in jedem Fall, ob der erste Parameter eine bestimmte Gegebenheit erfüllt. Für solche Reihenvergleiche gibt es die case-Konstruktion:

#!/bin/bash
 case $1 in
   -h|-H|--[hH][eE][lL][pP])
     echo "-h"
     ;;
   -v|-V)
     echo "-v"
     ;;
   -q|-Q)
     echo "-q"
     ;;
 esac

Das case-Konstrukt besteht aus den umschließenden Schlüsselworten case und esac (wie das schließende fi zu if ist auch esac die Umkehrung der Buchstaben aus case), einer Zeichenkette (hier $1), die überprüft wird, und den einzelnen Blöcken mit den jeweiligen Fällen. Diese Blöcke beginnen mit dem Muster, das von einer schließenden runden Klammer begrenzt wird, und enden mit einem Doppel-Semikolon – dazwischen stehen die Anweisungen, die für den jeweiligen Fall ausgeführt werden sollen.

In unserem Beispiel haben wir drei unterschiedliche Fälle, -h, -v und -q. Das Muster des ersten Falls besteht aus drei Teilen, von denen eines wahr sein muss. Die Muster selbst sind nahezu identisch mit denen aus unserem if-Konstrukt, allerdings deutlich übersichtlicher.

Neben den eckigen Klammern, mit denen man erlaubte Zeichen oder Zeichenbereiche angeben kann, gibt es noch die Platzhalter (Wildcards) ? für ein beliebiges Zeichen und * für beliebige Zeichenfolgen. Damit lassen sich zum Beispiel die verschiedenen Netzwerk-Devices voneinander unterscheiden:

case $device in
   eth*)
     echo "Ethernet"
     ;;
   ppp*)
     echo "Modem"
     ;;
   ippp*)
     echo "ISDN"
     ;;
   lo)
     echo "Loopback"
     ;;
   *)
     echo "Unbekannt"
 esac

Das letzte Muster, "*", trifft auf jede beliebige Zeichenkette zu – weshalb dieses case-Konstrukt eigentlich stets "Unbekannt" liefern müsste. Doch die Fälle werden von oben nach unten abgearbeitet, und es wird nur der erste ausgeführt, der passt: Alle weiteren werden ignoriert. So wird bei "ppp0" nur "Modem" ausgegeben, nicht aber "Unbekannt". Das Skript wird dann nach Abarbeitung des Falls hinter dem esac-Schlüsselwort fortgesetzt.

LinuxCommunity kaufen

Einzelne Ausgabe
 
Abonnements
 
TABLET & SMARTPHONE APPS
Bald erhältlich
Get it on Google Play

Deutschland

Ähnliche Artikel

  • Stromstoß für die Shell
    Shell-Skripte verrichten unter Linux allgegenwärtig ihren Dienst. Mit Bashdiff erhält die Standard-Shell Features, die Sie sonst nur in höheren Programmiersprachen finden.
  • Kreislauf
    Schleifen ermöglichen das mehrmalige Abarbeiten von Anweisungen. Dabei kann das begrenzende Ereignis sowohl außerhalb als auch innerhalb der Schleife liegen.
  • Bash-Skripte sind Programme
    Wer regelmäßig mit der Shell arbeitet, wird leicht zum Programmierer: Schreiben Sie mehrere Shell-Befehle in eine Textdatei und machen diese ausführbar, haben Sie schon Ihr erstes Shell-Skript entwickelt. Die Shell bietet als Programmiersprache aber noch viel mehr.
  • Erste Schritte mit Bash-Skripten
    Das Programmieren von Shell-Skripten ist keine Hexerei. Schon mit wenigen Grundkenntnissen sparen Sie durch das Automatisieren alltäglicher Aufgaben viel Zeit.
  • Teil 4: Kontrollstrukturen
    In den ersten drei Teilen haben Sie die Grundlagen der Bash-Programmierung und die Stringverarbeitung kennengelernt. Das genügt aber nicht, um wirklich leistungsfähige Programme zu schreiben – Kontrollstrukturen tun Not.
Kommentare

Infos zur Publikation

LU 08/2016: Multimedia

Digitale Ausgabe: Preis € 5,99
(inkl. 19% MwSt.)

LinuxUser erscheint monatlich und kostet 5,95 Euro (mit DVD 8,50 Euro). Weitere Infos zum Heft finden Sie auf der Homepage.

Das Jahresabo kostet ab 86,70 Euro. Details dazu finden Sie im Computec-Shop. Im Probeabo erhalten Sie zudem drei Ausgaben zum reduzierten Preis.

Bei Google Play finden Sie digitale Ausgaben für Tablet & Smartphone.

HINWEIS ZU PAYPAL: Die Zahlung ist ohne eigenes Paypal-Konto ganz einfach per Kreditkarte oder Lastschrift möglich!

Aktuelle Fragen

Wie kann man das berichtigen
Udo Muelle, 17.07.2016 20:39, 1 Antworten
Fehlschlag beim Holen von http://extra.linuxmint.com/dists/rosa/main/binary-i386/Packages Hash-S...
Installation Genimotion
Horst Müller, 15.07.2016 17:00, 1 Antworten
Hallo, ich kann Genimotion nicht installieren. Folgende Fehlermeldung habe ich beim Aufruf erh...
Probleme beim Hochfahren der Terastaion 5400 mit Unix-Distrib
Sheldon Cooper, 10.07.2016 09:32, 0 Antworten
Hallo ihr lieben, habe seit zwei Tagen das Problem, das das NAS (Raid5) nicht mehr sauber hoch...
Mit Firewire Videos improtieren?
Werner Hahn, 09.06.2016 11:06, 5 Antworten
Ich besitze den Camcorder Panasonic NV-GS330, bei dem die Videos in guter Qualität nur über den 4...
lidl internetstick für linux mint
rolf meyer, 04.06.2016 14:17, 3 Antworten
hallo zusammen ich benötige eure hilfe habe einen lidl-internetstick möchte ihn auf linux mint i...