Listing 7
#!/bin/bash for i in 1 2 3; do echo $i done
Eine Subshell liefert solange Argumente, bis sie abgearbeitet wurde. Sie können auf diese Weise die Ausgaben beliebiger Befehle auswerten, müssen aber penibel auf den Feldtrenner (Standard: Leerzeichen) achten. So versteht die Shell die Zeichenkette Hans Schmidt als zwei Werte. Listing 8 demonstriert eine Suche nach allen Dateien, welche den String log im Namen führen.
Listing 8
#!/bin/bash for i in $(ls *log*); do echo $i done
Die Bash bietet zusätzlich einen Zähler für Schleifen. Damit geben Sie exakt einen numerischen Bereich vor. Der Befehl seq erlaubt es dabei auf einfache Weise, eine solche Reihe zu erstellen. Geben Sie für den Befehl nur den Endwert an, arbeitet er in Einer-Schritten. Geben Sie sowohl Start- als auch Endwert an, erhalten Sie ebenso Einer-Schritte. Nutzen Sie das Kommando in der Form seq StartSchrittweiteEndwert, gestalten Sie die Zählweise noch feiner. Sie finden beide Methoden in Listing 9.
Listing 9
#!/bin/bash echo "Schleife mit Zähler" for ((i=0; i<5; i++)); do echo $i done echo "Schleife mit seq" for i in $(seq 4); do echo $i done
While-Schleife
Eine While-Schleife läuft solange, wie ein Kommando oder ein Block von Anweisungen erfolgreich arbeitet und den Exit-Code 0 liefert. Den Teil mit den Befehlen leiten Sie mit do ein und schließen ihn mit done ab. Steht kein explizites Kommando bereit, nutzen Sie den Befehl true, der stets den Exit-Code 0 ausgibt. Auf diese Weise erzeugen Sie eine Endlosschleife. Die Schleife in Listing 10 läuft, solange der Wert der Variablen $a größer ist als der von $b.
Listing 10
#!/bin/sh a=3 b=0 while [ $a -gt $b ]; do echo $b b=$(echo $b + 1 | bc) done
Until-Schleife
Eine Until-Schleife läuft, solange die Bedingung den Exit-Code 1 liefert. Den Anweisungsteil leiten Sie wieder mit do ein und schließen ihn mit done ab. Diese Schleifenvariante der Schleife entstand aus der Notwendigkeit heraus, dass einige Shells keinen negierten test mit vorangestelltem Ausrufezeichen beherrschen.
In der täglichen Praxis mit der Bash kommt die Until-Schleife eher selten zum Einsatz. Setzen Sie kein explizites Kommando ein, übernimmt false diesen Platz. Dieser Befehl liefert stets den Exit-Code 1 zurück, wodurch im Prinzip eine Endlosschleife entsteht. Listing 11 zeigt eine Schleife, die solange läuft, bis der Wert der Variablen $a gleich dem von $b ist.
Listing 11
#!/bin/sh a=3 b=0 until [ $a -eq $b ]; do echo $b b=$(echo $b + 1 | bc) done
Tritt innerhalb einer Schleife eine Abbruchbedingung auf, benötigen Sie einen entsprechenden Aufruf für die Reaktion. Hierfür stehen exit, break und continue bereit (siehe Tabelle “Sprunganweisungen”).
Sprunganweisungen
|
Anweisung |
Wirkung |
|---|---|
|
|
Beendet das laufende Shell-Skript sofort. |
|
|
Beendet die Schleife. Der Befehl ist ab der Stelle seines Erscheinens im Skript wirksam. |
|
|
Bricht nur den Durchlauf ab, die Schleife läuft weiter. |
Fallen stellen
Einem Shell-Skript können Sie wie jedem anderen Prozess Signale übermitteln. Um es anzusprechen, benötigen Sie die Nummer des zugehörigen Prozesses (PID). Die wichtigsten Signale finden Sie in der Tabelle “Signale”. Der Aufruf trap -l zeigt eine Übersicht über alle vorhandenen Signale.
Signale
|
Signal |
Nummer |
Aktion |
|---|---|---|
|
|
|
Prozess beenden |
|
|
|
Prozess sofort beenden |
|
|
|
Prozess normal beenden |
|
|
|
Prozess beenden nach Zeitablauf |
|
|
|
Prozess anhalten |
|
|
|
Prozess anhalten |
|
|
|
Prozess fortsetzen |
|
|
|
Benutzerdefiniertes Signal |
|
|
|
Benutzerdefiniertes Signal |
Es ist nicht möglich, die Signale 9 und 19 im Skript abzufangen. Bei den anderen Signalen besteht aber die Möglichkeit, sie durch neue Anweisungen für eigene Zwecke zu nutzen.
Um ein Gefühl für diese Technik zu bekommen, starten Sie das Skript aus Listing 12. Das Programm zeigt in einer Endlosschleife den Aufrufnamen des Skripts, dessen Prozess-ID sowie die Prozess-ID des aufrufenden Prozesses an. Von einem anderen Terminal aus senden Sie mittels dem Kill-Befehl nacheinander die Signale 19, 18, 10, 15 und 9. Einige der Signale beenden das Skript. Starten Sie es deshalb wieder, wenn Sie weiter experimentieren wollen.





