Bash: Schleifen
Mithilfe von Schleifen können einzelne Abschnitte eines Programmablaufs in Abhängigkeit von einer Bedingung mehrfach durchlaufen werden.
Zählschleifen
Eine häufige Form ist die Zählschleife, bei der der Wert einer Zählvariable fortlaufend verändert wird. Solange sich der Wert in einem definierten Bereich befindet, wird der Schleifendurchlauf wiederholt.
Die Schleife wird durch das Schlüsselwort for eingeleitet. Darauf folgen in doppelten runden Klammern ((…)) drei Anweisungen. In der ersten Anweisung wird der Ausgangswert der frei wählbaren Zählvariable definiert (i=1). Die zweite Anweisung enthält die Bedingung, die wahr sein muss, wenn die Schleife durchlaufen werden soll (i<=10). Die dritte Anweisung legt die Änderung der Zählvariable fest (i++).
for ((i=1; i<=10; i++)); do
echo $i
done
echo "Ende der Schleife."
Zwischen den Schlüsselwörtern do und done stehen nun die Anweisungen, die bei jedem Schleifendurchlauf ausgeführt werden sollen. Ist die angegebene Bedingung falsch, so wird unterhalb der Schleife mit der Programmausführung fortgefahren.
Bei der Definition der Ablaufbedingung ist darauf zu achten, dass diese wirklich irgendwann falsch ist, da es ansonsten zu einer Endlosschleife kommt und das Programm bis in alle Ewigkeit weiterlaufen würde. Sollte es zu so einem Fall kommen, kann das Programm noch mit Strg+C abgebrochen werden.
Im folgenden Beispiel für eine solche Endlosschleife lautet die Bedingung i>0 und da die Zählvariable von 1 beginnend immer um 1 erhöht wird, ist die Bedingung also niemals falsch.
# Beispiel für eine Endlosschleife:
for ((i=1; i>0; i++)); do
echo $i
done
echo "Ende der Schleife." # wird niemals erreicht
Für Zählschleifen, deren Schrittweite genau 1 beträgt, lassen sich auch folgende verkürzte Schreibweisen verwenden:
# mit hartkodierten Werten:
for i in {1..10}; do
echo $i
done
echo "Ende der Schleife."
# mit Werten aus Variablen:
min=1
max=10
for i in $(seq $min $max); do
echo $i
done
echo "Ende der Schleife."
Iterierbare Objekte durchlaufen
Arrays und Strings können in ähnlicher Weise durchlaufen werden. Hier gibt es allerdings keine Zählvariable, da bei dieser Konstruktion ein interner Zähler automatisch von 1 bis zum letzten Element des Arrays bzw. letzten Wort eines Strings hochzählt. Stattdessen wird eine Variable festgelegt (hier: element bzw. wort), die im weiteren Verlauf der Schleife das aktuelle Element des Arrays bzw. Wort des Strings repräsentiert.
tiere=(Hund Katze Maus Vogel Fisch)
for element in ${tiere[@]}; do # durchläuft ein Array
echo $element
done
tiere=(Hund Katze Maus Vogel Fisch)
for element in ${tiere[@]:1:3}; do # durchläuft 3 Elemente des Arrays ab Element 1
echo $element
done
pflanzen="Baum Strauch Kraut"
for wort in $pflanzen; do # durchläuft einen String
echo $wort
done
Schleifen mit while bzw. until
Schleifen mit dem Schlüsselwort while werden durchlaufen, solange die angegebene Bedingung wahr ist („Ablaufbedingung“).
Man beachte hier die Besonderheiten der Klammerung bei Bedingungen!
eingabe=0
while (( eingabe < 1000 )); do
read -p "Eine Ganzzahl kleiner als 1000: " eingabe
done
echo "Die Zahl war größer oder gleich 1000."
Schleifen mit dem Schlüsselwort until werden durchlaufen, bis die angegebene Bedingung wahr ist („Abbruchbedingung“).
eingabe=0
until (( eingabe >= 1000 )); do
read -p "Eine Ganzzahl kleiner als 1000: " eingabe
done
echo "Die Zahl war größer oder gleich 1000."