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.