11.6 Schleifen 

Auch in der Shell stehen Ihnen bei Bedarf verschiedene Schleifen zur Verfügung. Die for- und die while-Schleife kennen Sie ja bereits von der Skriptsprache awk, die in Abschnitt 8.4 behandelt wurde. Neu hinzu kommt die until-Schleife, die eine Art Negation der while-Schleife darstellt, doch dazu später mehr. Zunächst werden wir uns mit der bereits bekannten while-Schleife beschäftigen, damit der Umstieg von awk- auf Shell-Schleifen möglichst einfach gelingt.
11.6.1 while 

Die while-Schleife setzt sich aus einer bedingten Anweisung, wie sie bereits aus der if-Anweisung bekannt ist, und einem Anweisungsblock zusammen. Der Anweisungsblock wird durch das Schlüsselwort do eingeleitet und durch das Schlüsselwort done beendet.
while [ Bedingung ] do Anweisung1 Anweisung2 Anweisung3 done
Listing 11.28 Aufbau der while-Anweisung
Auch hier lässt sich eine übersichtlichere Schreibweise durch die Gliederung mit Semikolons erreichen:
while [ Bedingung ]; do AnweisungA AnweisungB AnweisungC done
Listing 11.29 Mehr Übersicht
Endlosschleifen
Auch in der Shell können Endlosschleifen realisiert werden. Dazu muss nur eine ständig wahre Bedingung übergeben werden. Dies wäre beispielsweise 1, true, "a" oder auch der simple Doppelpunkt:
while :; do echo "test"; sleep 2; done
Listing 11.30 Ein Beispiel
Mit while lassen sich nun bereits simple Menüs für Shellskripts erstellen. [Später werden Sie die select-Anweisung kennenlernen, die speziell für das Erstellen von Auswahlmenüs in Shellskripten gedacht ist.] Dazu lassen wir bei jedem Schleifendurchlauf erneut einen Wert durch read einlesen und vergleichen diesen mit vorgegebenen Werten. |
VALUE="" while [ "$VALUE" != "ende" ]; do clear echo "Auswahlmenü:" echo echo "Eingabe Auswirkung" echo "benutzer: zeigt die eingeloggten Benutzer an" echo "prozesse: zeigt die aktuellen Prozesse an" echo "laufzeit: zeigt die Laufzeit des Systems an" echo "ende: beendet das Skript" echo echo "Ihre Auswahl: " read VALUE if [ "$VALUE" = "benutzer" ]; then w elif [ "$VALUE" = "prozesse" ]; then ps elif [ "$VALUE" = "laufzeit" ]; then uptime|awk -F, '{print $1}' elif [ "$VALUE" = "ende" ]; then echo 'Bis bald!' else echo "Ihre Eingabe wird nicht unterstützt." fi echo "Drücken Sie Return, um fortzufahren." read garbage done
Listing 11.31 Ein Menü mit while
11.6.2 until 

Zu den bereits bekannten Schleifen kommt nun noch die until-Schleife hinzu. Diese neue Schleife kann als Negation der while-Schleife verstanden werden. Der Anweisungsblock der until-Schleife wird so lange ausgeführt, wie die Bedingung nicht erfüllt ist. Man kann praktisch die until-Schleife mit einer while !-Schleife gleichsetzen:
while [ ! 1 ]; do echo Test; done
until [ 1 ]; do echo Test; done
# oder noch kürzer:
until :; do echo Test; done
Listing 11.32 until und while !
11.6.3 for 

Die letzte Schleife in diesem Abschnitt ist die ebenfalls in ähnlicher Form aus awk bekannte for-Schleife. Der Aufbau dieser Schleife gestaltet sich wie folgt:
for VAR in WERT1 WERT2 WERT3 do Anweisung1 Anweisung2 done
Listing 11.33 for-Syntax
for arbeitet einen Anweisungsblock mit jedem angegebenen Wert einmal durch. Dieser Wert wird während des Durchlaufens des Anweisungsblocks der Variable VAR zugewiesen, mit der die Anweisungen arbeiten können. Der Anweisungsblock wird, wie bei der while-Schleife, durch do eingeleitet und mit done beendet.
Auch hierzu ein Beispiel, um Ihnen die Anwendung der Schleife möglichst leicht verständlich zu machen. Wir nehmen dabei als Werte alle TeX-Dateien in einem Verzeichnis an (in diesem Fall das Verzeichnis mit unserem Buch), die wir an die Variable DATEI zuweisen. Für jede Datei soll die Anzahl der darin enthaltenen Wörter ausgegeben werden. Zusätzlich soll die Gesamtzahl der Wörter summiert und nach Beendigung der Schleife ausgegeben werden. |
#!/bin/bash typeset -i WORDS=0 for DATEI in *.tex do NWORDS=`wc -w $DATEI| awk '{print $1}'` echo "Datei $DATEI beinhaltet $NWORDS Woerter." WORDS=WORDS+NWORDS done echo echo "Woerter gesamt: $WORDS"
Listing 11.34 Beispiel: for-Schleife
Wenn wir dieses Skript nun ausführen, erhalten wir die folgende Ausgabe: [Wobei das Buch zu diesem Zeitpunkt (1. Auflage) noch nicht ganz fertig geschrieben war.]
$ ./wordcount Datei anhg_dvd.tex beinhaltet 387 Woerter. Datei anhg_install.tex beinhaltet 4009 Woerter. Datei anhg_komref.tex beinhaltet 5741 Woerter. Datei anhg_loesungen.tex beinhaltet 3950 Woerter. Datei anhg_misc.tex beinhaltet 695 Woerter. Datei buch.tex beinhaltet 155 Woerter. Datei glossar.tex beinhaltet 834 Woerter. Datei kap01_kernel.tex beinhaltet 17702 Woerter. Datei kap03_einstieg.tex beinhaltet 8744 Woerter. Datei kap04_2_regex.tex beinhaltet 9851 Woerter. Datei kap04_3_tools.tex beinhaltet 3884 Woerter. Datei kap04_4_skripting.tex beinhaltet 5313 Woerter. Datei kap04_editoren.tex beinhaltet 3994 Woerter. Datei kap04_shell.tex beinhaltet 10687 Woerter. Datei kap05_2.tex beinhaltet 24673 Woerter. Datei kap05_sysadmin.tex beinhaltet 9604 Woerter. Datei kap07_dienste_dns.tex beinhaltet 2513 Woerter. Datei kap10_kdegnomewm.tex beinhaltet 3810 Woerter. Datei kap13_spiele.tex beinhaltet 6761 Woerter. Datei kap_boot.tex beinhaltet 8189 Woerter. Datei kapinterna_filesystem.tex beinhaltet 8416 Woerter. Datei kapinterna_prozesse.tex beinhaltet 8808 Woerter. Datei kap_lamp.tex beinhaltet 4163 Woerter. Datei kap_mailserver.tex beinhaltet 4724 Woerter. Datei kap_netz_clients.tex beinhaltet 5572 Woerter. Datei kap_netz_dienste.tex beinhaltet 7097 Woerter. Datei kap_nwsec_ueberwachen.tex beinhaltet 11378 Woerter. Datei kap_netzwerk.tex beinhaltet 10928 Woerter. Datei kap_progsprachen.tex beinhaltet 17442 Woerter. Datei kap_sicherheit.tex beinhaltet 14383 Woerter. Datei kap_ssh.tex beinhaltet 3489 Woerter. Datei kap_virtualmach.tex beinhaltet 1656 Woerter. Datei kap_x11apps.tex beinhaltet 4658 Woerter. Datei kap_x11.tex beinhaltet 7205 Woerter. Datei kapxx_software.tex beinhaltet 13367 Woerter. Datei k_vorwort.tex beinhaltet 8554 Woerter. Datei literatur.tex beinhaltet 756 Woerter. Datei newIcons.tex beinhaltet 174 Woerter. Datei new-macros.tex beinhaltet 110 Woerter. Datei trennung.tex beinhaltet 201 Woerter. Datei using-icons.tex beinhaltet 511 Woerter. Woerter gesamt: 265088
Listing 11.35 Anzahl der Wörter in unserem Buch
Sie können die Wertliste für for auch durch eine Kommandosubstitution übergeben. Sucht ein Skript beispielsweise alle Codedump-Dateien des Systems, so kann ein find-Aufruf für die Kommandosubstitution verwendet werden: |
for DATEI in `find / -name *core 2>/dev/null` do echo "Lösche Datei $DATEI..." rm $DATEI done
Listing 11.36 for mit Kommandosubstitution
11.6.4 seq – Schleifen mit Aufzählungen 

Manchmal kommt es vor, dass man eine Schleife mit einer Ziffernfolge durchlaufen möchte oder aus irgendeinem anderen Grund eine Ziffernfolge benötigt. Dafür wurde das Programm seq geschrieben, das hier nur kurz angesprochen werden soll. Eine Parameterliste für seq finden Sie in der Kommandoreferenz.
Soll seq beispielsweise alle Zahlen von 1 bis 10 auflisten, dann ist dies ganz einfach. Übergeben Sie den Start- und Endwert:
$ seq 1 10 1 2 3 4 5 6 7 8 9 10
Listing 11.37 seq in Aktion
for und seq
Möchte man seq nun in eine Schleife packen, so nutzt man am besten die Kommandosubstitution. Möchte man etwa einen bestimmten Satz Dateien löschen, dann wäre dies eine Möglichkeit dazu:
$ for i in `seq 1 10`; do rm "file$i" done
Listing 11.38 seq in einer for-Schleife