Home / LinuxUser / 2001 / 05 / Teil 5: Kontrollstrukturen die Zweite

Newsletter abonnieren

Lies uns auf...

Folge LinuxCommunity auf Twitter

Top-Beiträge

KDE Plasma Workspaces 4.8
(306 Punkte bei 32 Stimmen)
SUSE12
(173 Punkte bei 4 Stimmen)
Pardus Linux am Ende?
(164 Punkte bei 4 Stimmen)
OpenSuse 12.1-Service Kit 01/12
(161 Punkte bei 4 Stimmen)
Meinst Du: Patch CD Updates?
(161 Punkte bei 4 Stimmen)

Heftarchiv

LinuxUser Heftarchiv

EasyLinux Heftarchiv

Ubuntu User Heftarchiv

Ubuntu User Heftarchiv

Partner-Links:

Shopping
Topsuche
 
Yatego Deutschlands größte Shoppingmall. 10000 Shops,
3.5 Mio Artikel. Alle Bestseller, Servertechnik und Technik Themenwelten.

Notebooks und Netzwerkhardware bei Mercateo günstig kaufen.
Internet Telefonie mit VoIP Telefonen von Gigaset
Das B2B Portal www.Linx.de informiert über Produkte und Dienstleistungen.
Günstige Digitalkameras finden Sie im Preisvergleich.

Checkpoint Charlie

Teil 5: Kontrollstrukturen die Zweite

01.05.2001 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.

Einem Freund empfehlen    Druckansicht Bookmark and Share
Kommentare

815 Hits
Wertung: 0 Punkte (1 Stimme)

Schlecht Gut

Infos zum Autor

Mirko Dölle

Redakteur für Linux bei c't, Heise Zeitschriften Verlag; ehemals Competence Center Hardware/Linux-Magazin, Linux New Media AG


Infos zur Publikation

Infos zur Publikation

title_2012_02

Aktuelle Ausgabe kaufen:

Heft bestellen Heft als PDF kaufen

LinuxUser erscheint monatlich und kostet in der Nomedia-Ausgabe EUR 5,50 und mit DVD EUR 8,50. Weitere Informationen zum Heft finden Sie auf der LinuxUser-Homepage.

Im LinuxUser-Probeabo erhalten Sie drei Ausgaben für 3 Euro. Das Jahresabo (ab EUR 56,10) können Sie im LNM-Shop bestellen.

Tipp der Woche

Knoppix: Bootvorgang mit Cheatcode beschleunigen
Knoppix: Bootvorgang mit Cheatcode beschleunigen
Marcel Hilzinger, 18.01.2012 21:05, 0 Kommentare

Die Bootsequenz der Live-Distribution sucht beim Start zunächst auf Festplatten, dann auf USB-Sticks und erst dann in den DVD-Laufwerken (/dev/sr* oder /dev/scd*) nac...

Aktuelle Fragen

OpenSuse 12.1-Service Kit 01/12
Christoph-J. Walter, 28.01.2012 08:52, 2 Antworten
Hallo Gemeinde, ich habe 12.1 neu installiert. Alles in Ordnung! Nun möchte ich das Service Kit (...
Ubuntu 11.10 konfigurieren
Michael Hinz, 27.01.2012 17:52, 0 Antworten
Ubuntu läuft bei mir. Allerdings nur, wenn die Daten-CD eingelegt ist. Unabhängig von Bios-Einste...
SUSE12
Jörg Müller, 25.01.2012 14:27, 5 Antworten
Hallo Gemeinde Ich habe schon ziemlich lange auf einem Rechner Linux laufen, bin also nicht ganz...
Hat jemand Erfahrung beim Einsatz einer Kinect / OpenNI?
GoaSkin , 24.01.2012 23:35, 0 Antworten
Hallo, ich habe mir eine Kinect zugelegt, um zu schauen, was man damit unter Linux so machen k...
Kollaboration - Zeichnen auf mehreren Geräten gleichzeitig
Ludwig jun. B., 19.01.2012 11:17, 4 Antworten
Schönen guten Tag, ich suche aktuell eine Software für Linux/Windows (eines von beiden), welch...