Die for-Schleife ist das zentrale Werkzeug in Bash, um Befehle wiederholt auszuführen. Sie durchläuft eine Liste von Elementen und führt für jedes Element einen Befehlsblock aus.

Syntax der for-Schleife

Die Grundstruktur der for-Schleife sieht so aus:

for VARIABLE in LISTE
do
    BEFEHLE
done
  • VARIABLE - Der Name der Laufvariablen. Sie nimmt bei jedem Durchlauf den Wert des aktuellen Elements an.
  • LISTE - Die Elemente, die durchlaufen werden sollen: Zeichenketten, Zahlenbereiche, Dateinamen oder die Ausgabe eines Befehls.
  • BEFEHLE - Die Anweisungen, die für jedes Element ausgeführt werden.

Du kannst do auch in dieselbe Zeile wie for schreiben, dann folgt ein Semikolon:

for VARIABLE in LISTE; do
    BEFEHLE
done

Über eine Liste von Werten iterieren

Die einfachste Form: Eine Liste von durch Leerzeichen getrennten Werten.

for server in web01 web02 db01 db02
do
    echo "Prüfe $server..."
done

Ausgabe:

Prüfe web01...
Prüfe web02...
Prüfe db01...
Prüfe db02...

Über einen Zahlenbereich iterieren

Mit der Brace-Expansion {START..ENDE} erzeugst du einen Zahlenbereich:

for nummer in {1..5}
do
    echo "Durchlauf $nummer"
done

Ausgabe:

Durchlauf 1
Durchlauf 2
Durchlauf 3
Durchlauf 4
Durchlauf 5

Schrittweite festlegen

Ab Bash 4 kannst du mit {START..ENDE..SCHRITT} eine Schrittweite angeben:

for i in {0..100..25}
do
    echo "Wert: $i"
done

Ausgabe:

Wert: 0
Wert: 25
Wert: 50
Wert: 75
Wert: 100

Über Dateien iterieren

Mit Glob-Mustern wie * oder *.txt durchläufst du Dateien in einem Verzeichnis:

for datei in /var/log/*.log
do
    echo "Verarbeite $datei"
done

Dieses Skript gibt alle .log-Dateien im Verzeichnis /var/log/ aus.

Über ein Array iterieren

Arrays durchläufst du mit der Syntax "${ARRAY[@]}":

pakete=("nginx" "postgresql" "redis" "nodejs")

for paket in "${pakete[@]}"
do
    echo "Installiere $paket..."
done

Die Anführungszeichen um "${pakete[@]}" sind wichtig: Sie sorgen dafür, dass Elemente mit Leerzeichen korrekt als ein Element behandelt werden.

Die C-Stil for-Schleife

Bash unterstützt auch eine Schleifensyntax, die an C und andere Programmiersprachen angelehnt ist:

for ((INIT; BEDINGUNG; SCHRITT))
do
    BEFEHLE
done
  • INIT - Initialisierung der Zählvariablen (wird einmal ausgeführt).
  • BEDINGUNG - Die Schleife läuft, solange diese Bedingung wahr ist.
  • SCHRITT - Wird nach jedem Durchlauf ausgeführt.

Beispiel:

for ((i = 1; i <= 5; i++))
do
    echo "Zähler: $i"
done

Ausgabe:

Zähler: 1
Zähler: 2
Zähler: 3
Zähler: 4
Zähler: 5

Diese Variante eignet sich besonders, wenn du eine präzise Kontrolle über den Schleifenablauf brauchst.

Schleifensteuerung mit break und continue

Schleife abbrechen mit break

Mit break beendest du die Schleife vorzeitig:

for datei in /backup/*.tar.gz
do
    if [[ -f "$datei" ]]; then
        echo "Backup gefunden: $datei"
        break
    fi
done

Sobald die erste .tar.gz-Datei gefunden wird, bricht die Schleife ab.

Durchlauf überspringen mit continue

Mit continue springst du zum nächsten Schleifendurchlauf:

for nummer in {1..10}
do
    if (( nummer % 2 == 0 )); then
        continue
    fi
    echo "Ungerade: $nummer"
done

Ausgabe:

Ungerade: 1
Ungerade: 3
Ungerade: 5
Ungerade: 7
Ungerade: 9

Die geraden Zahlen werden übersprungen, weil continue den Rest des Schleifenkörpers überspringt.

Praktische Beispiele

Dateien umbenennen

Dieses Skript ersetzt Leerzeichen in Dateinamen durch Unterstriche:

for datei in *\ *
do
    mv "$datei" "${datei// /_}"
done

Die Parametererweiterung ${datei// /_} ersetzt alle Leerzeichen durch Unterstriche.

Dateiendungen ändern

So benennst du alle .jpeg-Dateien in .jpg um:

for bild in *.jpeg
do
    mv -- "$bild" "${bild%.jpeg}.jpg"
done

Die Syntax ${bild%.jpeg} entfernt die Endung .jpeg vom Dateinamen.

Mehrere Server anpingen

for host in 192.168.1.{1..5}
do
    ping -c 1 -W 1 "$host" > /dev/null 2>&1 && echo "$host erreichbar" || echo "$host nicht erreichbar"
done

Die Brace-Expansion {1..5} wird hier direkt in die IP-Adresse eingebaut.

Backup mehrerer Verzeichnisse erstellen

verzeichnisse=("/etc" "/home" "/var/www")

for verz in "${verzeichnisse[@]}"
do
    tar -czf "/backup/$(basename "$verz")-$(date +%Y%m%d).tar.gz" "$verz" 2>/dev/null
    echo "Backup von $verz erstellt"
done

Zusammenfassung

Die for-Schleife in Bash durchläuft Listen, Zahlenbereiche, Dateien oder Arrays und führt für jedes Element die angegebenen Befehle aus. Mit break und continue steuerst du den Ablauf der Schleife. Die C-Stil-Variante bietet zusätzliche Kontrolle über Initialisierung, Bedingung und Schrittweite.

Verwandte Artikel