4.13 Kontrollierte Sprünge
Es gibt drei Möglichkeiten, eine Ablaufstruktur wie die Schleifen von innen (zwischen do und done) zu regulieren oder unmittelbar zu verlassen. Damit kann man allerdings nicht in eine bestimmte Anweisung verzweigen, sondern lediglich zur nächsten Ablaufstruktur springen.
|
continue – damit wird der aktuelle Schleifenaufruf beendet und es wird mit dem nächsten Durchlauf fortgefahren. |
|
break – beendet die Schleife. Befindet sich break in mehreren geschachtelten Schleifen, wird nur die innerste verlassen. |
|
exit – beendet das komplette Programm. |
Es sei angemerkt, dass exit keine schleifentypische Anweisung ist, im Gegensatz zu break und continue. Auf continue und break soll daher etwas genauer eingegangen werden.
4.13.1 Der Befehl continue
Der Befehl continue beendet nur die aktuelle Schleifenausführung. Das bedeutet, dass ab dem Aufruf von continue im Anweisungsblock der Schleife alle anderen Anweisungen übersprungen werden und die Programmausführung zur Schleife mit der nächsten Ausführung zurückspringt.
# Demonstriert die Verwendung von continue
# acontinue1
i=1
while [ $i -lt 20 ]
do
j=`expr $i % 2`
if [ $j -ne 0 ]
then
i=`expr $i + 1`
continue
fi
echo $i
i=`expr $i + 1`
done
Das Script bei der Ausführung:
you@host > ./acontinue1
2
4
6
8
10
12
14
16
18
Bei diesem Script wird überprüft, ob es sich bei der Variable »i« um eine ungerade Zahl handelt. Wenn »i« modulo 2 nicht 0 ist, also ein Rest zurückgegeben wird, handelt es sich um eine ungerade Zahl. Wir wollen aber nur gerade Zahlen ausgeben lassen, weshalb im if-Anweisungsblock zwischen then und fi eine continue-Anweisung ausgeführt wird. Dabei wird die echo-Ausgabe auf dem Bildschirm ausgelassen und es geht unmittelbar mit dem nächsten Schleifendurchlauf weiter (hier: die nächste Überprüfung). Hiermit haben Sie sich die else-Alternative erspart.
Hinweis Mit dem Modulo-Operator % wird der Rest einer ganzzahligen Division ermittelt.
|
Natürlich lässt sich continue auch mit jeder anderen Schleife verwenden. Wollen Sie bspw. alle Argumente der Kommandozeile darauf prüfen, ob etwas Brauchbares dabei ist, könnten Sie folgendermaßen vorgehen:
# Demonstriert die Verwendung von continue
# acontinue2
# Durchläuft alle Argumente der Kommandozeile nach dem Wort
"automatik"
for var in "$@"
do
if [ "$var" != "automatik" ]
then
continue
fi
echo "Ok, \"$var\" vorhanden ...!"
done
Das Script bei der Ausführung:
you@host > ./acontinue2 test1 test2 test3 test4
you@host > ./acontinue2 test1 test2 test3 test4 automatik \
> test5 testx
Ok, "automatik" vorhanden ...!
In diesem Beispiel wird Argument für Argument aus der Kommandozeile durchlaufen und überprüft, ob sich eine Zeichenkette mit »automatik« darin befindet. Handelt es sich beim aktuellen Argument nicht um entsprechendes Wort, wird mittels continue wieder zur nächsten Schleifenanweisung hochgesprungen.
4.13.2 Der Befehl break
Im Gegensatz zu continue können Sie mit break eine Schleife vorzeitig beenden, sodass die Programmausführung unverzüglich hinter dem Schlüsselwort done ausgeführt wird. Man spricht hierbei von einem kontrollierten Schleifenabbruch. break setzt man immer dann, wenn man mit einer Schleife ein bestimmtes Ziel schon vorzeitig erreicht hat oder ein unerwarteter Fehler aufgetreten ist – sich eine weitere Ausführung des Scripts also nicht mehr lohnt – und natürlich bei einer Endlosschleife.
Um auf das Script acontinue2 zurückzukommen, könnte man hier bspw. break hinter der echo-Ausgabe setzen, sofern man mit einer gefundenen Zeichenkette zufrieden ist. Damit kann man sich ersparen, dass alle Argumente durchlaufen werden, obwohl das benötigte längst gefunden wurde. Hier das Script mit break:
# Demonstriert die Verwendung von break
# abreak
# Durchläuft alle Argumente der Kommandozeile nach
# dem Wort "automatik"
for var in "$@"
do
if [ "$var" = "automatik" ]
then
echo "Ok, \"$var\" vorhanden ...!"
break
fi
done
# Hier gehts nach einem break weiter ...
Natürlich kann break wie continue in jeglicher Art von Schleifen eingesetzt werden. Ein oft gemachter Fehler ist das Setzen von break in einer verschachtelten Schleife. Wenn break in der innersten Schleife verwendet wird, wird auch nur diese Schleife abgebrochen. Zwar ist es aus Übersichtlichkeitsgründen nicht ratsam, mehrere Schleifen zu verschachteln, aber da es sich häufig nicht vermeiden lässt, sollte dennoch darauf hingewiesen werden. Hier ein Beispiel:
# Demonstriert die Verwendung von break in einer Verschachtelung
# abreak2
i=1
for var in "$@"
do
while [ $i -lt 5 ]
do
echo $i
i=`expr $i + 1`
break
echo "Wird nie ausgegeben"
done
echo $var
done
Das Script bei der Ausführung:
you@host > ./abreak2 test1 test2 test3 test4
1
test1
2
test2
3
test3
4
test4
Obwohl hier ein break verwendet wurde, werden alle Kommandozeilen-Argumente ausgegeben. Dass break dennoch funktioniert, beweist die Nicht-Ausgabe von »Wird nie ausgegeben«. break gilt hier nur innerhalb der while-Schleife und bricht somit auch nur diese ab.
Ihre Meinung
Wie hat Ihnen das Openbook gefallen? Wir freuen uns immer über Ihre Rückmeldung. Schreiben Sie uns gerne Ihr Feedback als E-Mail an kommunikation@rheinwerk-verlag.de.
|