Bitte warten...

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++).

Code kopieren
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.

Code kopieren
# 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:

Code kopieren
# 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.

Code kopieren
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!

Code kopieren
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“).

Code kopieren
eingabe=0
until (( eingabe >= 1000 )); do
  read -p "Eine Ganzzahl kleiner als 1000: " eingabe
done
echo "Die Zahl war größer oder gleich 1000."