Wie Verzweigungen gehören Schleifen zu den Kontrollstrukturen, mit der der lineare Ablauf unterbrochen wird. Schleifen sollen uns in erster Linie Arbeit ersparen, in dem wir einen Codeblock mehrfach durchlaufen könne, ohne ihn mehrmals eintippen zu müssen.
1 | Einführung |
---|---|
2 | Der bash Prompt |
3 | key bindings |
4 | Der Startvorgang |
5 | Environment Variablen |
6 | builtin commands |
7 | Arbeiten mit Dateien |
8 | nano |
9 | bash Scripting |
10 | Variablen |
11 | Verzweigungen (if) |
12 | Schleifen |
13 | Kommandozeilenparameter |
14 | exit Codes bash Tutorial Teil 14 |
15 | von der Idee zum Script |
16 | grep |
17 | Piping und Redirection |
18 | tee |
Schleifen
Schau dir mal folgendes Beispiel an:
# noloop.sh
echo "1"
echo "und"
echo "1"
echo "und"
echo "1"
echo "und"
echo "1"
echo "und"
echo "1"
echo "und"
echo "aus"
Es gibt fünfmal eine Zeile „1“ gefolgt von einer Zeile „und“ aus. Als Letztes wird noch eine Zeile „aus“ gedruckt.
Das Programm tut zwar, was es soll, hat aber einen eklatanten Nachteil. Wenn wir jetzt beispielsweise statt „1“ eine „2“ ausgeben wollten, müssen wir fünf Zeilen im Script ändern (gut, wir hätten den Ausgabewert auch in einer Variable ablegen können, aber darum geht’s hier nicht). Eleganter geht das mit einer Schleife.
Die while Schleife
Die while Schleife ist immer so aufgebaut:
while [ Bedingung ]; do
Anweisungsblock
done
Sie führt den Anweisungsblock so lange aus, wie die Bedingung erfüllt ist. Für die Bedingung gilt das gleich wie bei if beschrieben.
Wir führen jetzt einen Zähler ein, der im Anweisungsblock hochgezählt wird. Wenn dieser den Wert 5 erreicht, endet die Schleife
# whileloop.sh
count=1
while [ ${count} -le 5 ]; do
echo "1"
echo "und"
count=$((${count} + 1))
done
echo "aus"
Until Schleife
Die until
Loop ist while
syntaktisch sehr ähnlich, allerdings wird die Bedingung anders interpretiert. Während while solange läuft, wie die Bedingung erfüllt ist, läuft until bis die Bedingung erfüllt ist. Ein anderer Unterschied ist, dass while
die Bedingung vor dem Anweisungsblock prüft, until
macht dies danach. Das Beispiel von oben sieht mit until so aus:
# untilloop.sh
count=1
until [ ${count} -eq 5 ]; do
echo "1"
echo "und"
count=$((${count} + 1))
done
echo "aus"
until
wird scheinbar eher selten benutzt, zumindest sehe ich diese Schleifenart kaum. Die Bedingung ist erfüllt, wenn count
einen Wert von 5 hat. Da dies unmittelbar nach dem Inkrementieren passiert, wird der Schleifenblock nur viermal durchlaufen.
Die for Schleife
Während while
und until durch eine Bedingung gesteuert werden, läuft die for
Loop über eine Liste von Elementen. Dies kann eine Liste sein, die im Script selber aufgebaut wird oder bspw. eine Liste von Dateien in einem Verzeichnis.
#forloop.sh
#Ausgabe der ungeraden Zahlen bis 10
for i in 1 3 5 7 9; do
echo "i=${i}"
done
#Ausgabe aller Dateien in /etc
for d in /etc/*; do
echo "${d}"
done
Die erste for
Loop läuft über die Liste mit den ungeraden Zahlen zwischen 0
und 10
und gibt diese aus. Die zweite Schleife zeigt, wie du relativ einfach mit for
über die Liste aller Files in /etc
iterieren kannst.
Schleifen abbrechen
Manchmal kommt es vor, dass du eine Schleife vorzeitig abbrechen musst. Dafür steht das break
Kommando zur Verfügung.
In diesem Beispiel brechen wir die Ausgabe der ungeraden Zahl nach dem Wert 5
ab.
#break.sh
#Ausgabe der ungeraden Zahlen bis 10
for i in 1 3 5 7 9; do
if [ ${i} -eq 5 ]; then
break
fi
echo "i=${i}"
done
Durchlauf überspringen
Ebenso kommt es vor, dass du einen Schleifendurchlauf überspringen musst. Dazu dient continue
.
Wir lassen in diesem Beispiel den Wert 5
einfach aus:
#continue.sh
#Ausgabe der ungeraden Zahlen bis 10
for i in 1 3 5 7 9; do
if [ ${i} -eq 5 ]; then
continue
fi
echo "i=${i}"
done
Endlosschleifen
Achte bei allen Schleifentypen darauf, dass du die Bedingung so wählst, dass die Schleife zum Ende kommen kann, sonst läuft dein Script für alle Ewigkeiten! Die Liste der ungeraden Zahlen hat eine definierte Anzahl von Elementen, die ein Schleifenende impliziert. Ebenso verhält es sich mit der Liste der Dateien in einem Verzeichnis. Wenn du allerdings innerhalb einer Zählschleife vergisst, den
Fazit
Schleifen sind unverzichtbar, um sich mehrfach wiederholende Kommandos einfach und elegant auszuführen.Sie werden dir immer wieder begegnen.