Die while-Schleife führt einen Befehlsblock wiederholt aus, solange eine angegebene Bedingung wahr ist. Sie eignet sich besonders für Aufgaben, bei denen die Anzahl der Durchläufe vorab nicht feststeht.

Syntax der while-Schleife

Die grundlegende Struktur sieht so aus:

while [BEDINGUNG]
do
  BEFEHLE
done
  • BEDINGUNG - Ein Ausdruck, der vor jedem Durchlauf geprüft wird.
  • BEFEHLE - Die Anweisungen, die bei erfüllter Bedingung ausgeführt werden.

Die Schleife prüft die Bedingung vor jedem Durchlauf. Ist sie wahr, werden die Befehle ausgeführt. Ist sie falsch, endet die Schleife und das Skript macht mit der nächsten Zeile nach done weiter.

Einfaches Beispiel mit Zähler

Das folgende Beispiel gibt Zahlen von 0 bis 2 aus:

zaehler=0

while [ $zaehler -le 2 ]
do
  echo "Durchlauf: $zaehler"
  ((zaehler++))
done

Die Ausgabe:

Durchlauf: 0
Durchlauf: 1
Durchlauf: 2

Die Bedingung [ $zaehler -le 2 ] prüft, ob der Zähler kleiner oder gleich 2 ist. Nach jedem Durchlauf erhöht ((zaehler++)) den Wert um eins. Sobald der Zähler 3 erreicht, ist die Bedingung nicht mehr erfüllt und die Schleife endet.

Endlosschleifen

Eine Endlosschleife läuft unbegrenzt weiter, weil ihre Bedingung immer wahr bleibt. Das ist nützlich für Dienste, die dauerhaft laufen sollen, oder für Menüs, die auf Benutzereingaben warten.

Der Doppelpunkt : ist ein eingebauter Befehl, der immer den Rückgabewert 0 (wahr) liefert:

while :
do
  echo "Warte auf Ereignis..."
  sleep 5
done

Alternativ kannst du true verwenden, was dasselbe bewirkt:

while true
do
  echo "Warte auf Ereignis..."
  sleep 5
done

Um eine solche Schleife zu beenden, drücke Strg+C.

Für einzeilige Befehle trenne die Anweisungen mit Semikolons:

while :; do echo "Läuft..."; sleep 1; done

Dateien zeilenweise einlesen

Eine häufige Anwendung ist das zeilenweise Verarbeiten von Dateien. Der read-Befehl liest dabei eine Zeile nach der anderen:

while read -r zeile
do
  echo "$zeile"
done < /var/log/syslog

Die Eingabeumleitung < /var/log/syslog führt den Dateiinhalt dem read-Befehl zu. Die Option -r verhindert, dass Backslashes als Escape-Zeichen interpretiert werden.

Standardmäßig entfernt read führende und abschließende Leerzeichen. Um das zu verhindern, setze IFS= (Internal Field Separator) vor den Befehl:

while IFS= read -r zeile
do
  echo "$zeile"
done < /etc/hosts

Das ist wichtig, wenn Einrückungen oder Leerzeichen am Zeilenanfang erhalten bleiben sollen.

Schleifensteuerung mit break und continue

Mit break und continue kannst du den Ablauf der Schleife gezielt beeinflussen.

break - Schleife vorzeitig beenden

Der Befehl break beendet die Schleife sofort und springt zur ersten Anweisung nach done:

zaehler=0

while [ $zaehler -lt 10 ]
do
  if [ $zaehler -eq 5 ]; then
    echo "Abbruch bei $zaehler"
    break
  fi
  echo "Zahl: $zaehler"
  ((zaehler++))
done

echo "Schleife beendet"

Ausgabe:

Zahl: 0
Zahl: 1
Zahl: 2
Zahl: 3
Zahl: 4
Abbruch bei 5
Schleife beendet

Die Schleife würde normalerweise bis 9 laufen, aber break beendet sie, sobald der Zähler 5 erreicht.

continue - Durchlauf überspringen

Der Befehl continue überspringt den Rest des aktuellen Durchlaufs und startet sofort den nächsten:

zaehler=0

while [ $zaehler -lt 5 ]
do
  ((zaehler++))
  if [ $zaehler -eq 3 ]; then
    continue
  fi
  echo "Zahl: $zaehler"
done

Ausgabe:

Zahl: 1
Zahl: 2
Zahl: 4
Zahl: 5

Die Zahl 3 fehlt in der Ausgabe, weil continue bei diesem Wert den echo-Befehl überspringt.

Praktisches Beispiel: Auf Dienst warten

Das folgende Skript prüft alle 2 Sekunden, ob ein Webserver erreichbar ist:

while ! curl -s --head http://localhost:8080 > /dev/null
do
  echo "Server noch nicht bereit, warte..."
  sleep 2
done

echo "Server ist erreichbar!"

Das Ausrufezeichen ! vor curl negiert den Rückgabewert. Die Schleife läuft also, solange der Server nicht erreichbar ist.

Zusammenfassung

Die while-Schleife wiederholt Befehle, solange eine Bedingung erfüllt ist. Mit break kannst du die Schleife vorzeitig beenden, mit continue einzelne Durchläufe überspringen. In Kombination mit read eignet sich die Schleife gut zum zeilenweisen Verarbeiten von Dateien.

Verwandte Artikel