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.
Listing 12
#!/bin/sh while true; do echo $0 $$ $PPID sleep 30 done
Die Trap-Anweisung zum Abfangen von Signalen hat die Form trap ErsatzkommandoSignal. Geben Sie kein Kommando als Ersatz an, ignoriert das Skript das Signal lediglich. Listing 13 demonstriert das Abfangen eines Signals per trap in der Praxis. Senden Sie das Signal 10 oder SIGUSR1 an das Programm, zeigt es die Belegung der Massenspeicher im Rechner an.
Listing 13
#!/bin/sh # Signale ignorieren trap '' 2 20 # Auf Signal 10 reagieren trap 'df -h' 10 while true; do echo "$$: $a" sleep 3 done
Verzweigungen und Schleifen
Das Skript aus Listing 14 bildet ein Auswahlmenü mitsamt eines Untermenüs ab. Es setzt die folgenden Anforderungen um:
- Komfortable Eingabe über die Tastatur mit je einem Tastendruck.
- Auswerten der Eingabe, sodass fehlerhafte Eingaben nicht auf dem Bildschirm erscheinen.
- Für jede Auswahl gibt es genau eine Eingabemöglichkeit.
Listing 14
#!/bin/bash
while true; do
# Bildschirm löschen
clear
# Hauptmenü
echo "(1) Punkt 1"
echo "(2) zum Untermenü"
echo "(9) Beenden"
# Auswahl einlesen, einstellig
read -n1 -p "Aufgabe: " auf
# Auswertung. Zahlenwerte als String
# verhindern Fehleranzeigen, falls
# Buchstaben gedrückt werden
if [ "$auf" = "1" ]; then
echo "Punkt 1"
sleep 5
elif [ "$auf" = "2" ]; then
# neue Schleife
while true; do
# Bildschirm löschen
clear
# Untermenü
echo "(a) Punkt a "
echo "(b) Punkt b "
echo "(z) zurück"
read -n1 -p "Aufgabe: " umenu
if [ "$umenu" = "a" ]; then
echo "Punkt a"
sleep 5
elif [ "$umenu" = "b" ]; then
echo "Punkt b"
sleep 5
elif [ "$umenu" = "z" ]; then
# Zurück zum Hauptmenü
break
fi
done
elif [ "$auf" = "9" ]; then
# Skriptende
break
fi
done
clear
echo "Skriptende"
Um das Beispiel einfach zu gestalten, besteht jede Funktion nur aus der Zeile echo "Punkt N", deren Ausgabe für jeweils fünf Sekunden auf dem Bildschirm verbleibt. Für das Hauptmenü stehen drei Möglichkeiten bereit, von denen eine das Skript beendet und eine weitere das Untermenü startet. Beim Beenden zeigt das Skript eine abschließende Nachricht an. Das Untermenü enthält wieder drei Punkte, wobei einer zum Rücksprung ins Hauptmenü dient. Zum Löschen des Bildschirms kommt clear zum Einsatz.
Einige der bereits im vorigen Teil des Workshops angesprochenen Techniken finden sich in diesem Programm wieder. Zum Einlesen der Eingabe steht bei read eine Länge der Zeichenkette von 1; der Anwender braucht also nicht mehr [Eingabe] zu drücken.
Um Fehlermeldungen aufgrund nicht numerischer Zeichen bei test zu vermeiden, vergleichen Sie einfach Zeichenketten anstelle numerischer Werte. Drückt der Benutzer eine Taste, die einem Buchstaben zugeordnet ist, erzeugt das keine Fehlermeldung.
Für das Untermenü starten Sie eine zweite While-Schleife, die das Programm ausschließlich über break wieder verlassen kann. Die Nachricht beim Beenden des Skripts schreiben Sie ans Dateiende, wo das Skript bei einem Abbruch der Schleife via break landet. Alternativ wäre es möglich, die Nachricht vor ein exit innerhalb des If-Konstrukts zu setzen.





