Bash Schleifen & Bedingungen

5 Kernkonzepte
Die wichtigsten Kontrollstrukturen für Bash-Skripte: if-else · case · for · while · until Mit diesen Konstrukten steuern Sie den Ablauf Ihrer Skripte – von einfachen Bedingungen bis zu komplexen Schleifen und Fallunterscheidungen.

if-else – Bedingte Ausführung

if [ Bedingung ]; then ... fi
if [ Bedingung ]; then ...
elif [ Bedingung2 ]; then ...
else ...
fi

if-else führt Code basierend auf Bedingungen aus. Mit elif können Sie mehrere Bedingungen prüfen.

Wichtige Vergleichsoperatoren

Operator Beschreibung
[[ $a == $b ]] Zeichenketten gleich
[[ $a != $b ]] Zeichenketten ungleich
[[ $a -eq $b ]] Zahlen gleich (equal)
[[ $a -ne $b ]] Zahlen ungleich (not equal)
[[ $a -gt $b ]] Zahlen größer als (greater than)
[[ $a -lt $b ]] Zahlen kleiner als (less than)
[[ $a -ge $b ]] Zahlen größer oder gleich
[[ $a -le $b ]] Zahlen kleiner oder gleich
[[ -z $var ]] Variable ist leer (zero length)
[[ -n $var ]] Variable ist nicht leer
[[ -f datei ]] Datei existiert
[[ -d ordner ]] Verzeichnis existiert
Beispiele
# Einfache if-Bedingung
if [ $1 == "start" ]; then
  echo "Starte Dienst..."
else
  echo "Unbekannter Befehl"
fi
# Mehrere Bedingungen mit elif
if [ $1 == "stop" ]; then
  echo "Stoppe Dienst..."
elif [ $1 == "restart" ]; then
  echo "Starte Dienst neu..."
else
  echo "Unbekannter Befehl: $1"
fi
# Datei existiert prüfen
if [ -f "/etc/passwd" ]; then
  echo "Die Datei passwd existiert"
fi
# Logische Verknüpfungen: UND / ODER
if [ -f "$datei" ] && [ -r "$datei" ]; then
  echo "Datei existiert und ist lesbar"
fi
Tipp: Verwenden Sie [[ ]] (doppelte Klammern) für modernere und sicherere Bedingungen. [[ $a == $b ]] funktioniert auch mit leeren Variablen ohne Fehler.

case – Fallunterscheidung

case $var in pattern) ...;; esac
case $var in
  pattern1) ... ;;
  pattern2) ... ;;
  *) ... ;;
esac

case ist eine Alternative zu mehreren if-elif-Bedingungen. Ideal für Menüs oder Befehlsauswertung mit Platzhaltern.

Platzhalter in case

Platzhalter Beschreibung
* Alles (Standard-Fallback)
? Ein beliebiges Zeichen
[abc] Eines der Zeichen a, b oder c
start|stop|restart Mehrere Muster mit | (ODER)
Beispiele
# Einfache Befehlsauswertung
case $1 in
  start) echo "Starte Dienst..." ;;
  stop) echo "Stoppe Dienst..." ;;
  restart) echo "Starte Dienst neu..." ;;
  status) echo "Dienst läuft..." ;;
  *) echo "Unbekannter Befehl: $1" ;;
esac
# Mit Platzhaltern für Dateiendungen
case $datei in
  *.txt) echo "Textdatei" ;;
  *.jpg|*.png) echo "Bilddatei" ;;
  *.sh) echo "Bash-Skript" ;;
  *) echo "Unbekannter Dateityp" ;;
esac
# Menü-Auswahl mit Fall-through
case $antwort in
  j|J) echo "Ja" ;;
  n|N) echo "Nein" ;;
  *) echo "Ungültige Eingabe" ;;
esac
Tipp: case ist besonders übersichtlich für Menüs und Optionen. Die Muster werden von oben nach unten geprüft – der erste Treffer wird ausgeführt.

for – Iteration über Listen

for var in liste; do ... done
for var in liste; do ... done

for iteriert über eine Liste von Werten – Zahlenbereiche, Dateien, Zeichenketten oder die Ausgabe eines Befehls.

Wichtige Varianten

Varianten Beschreibung
for i in {1..10} Zahlenbereich 1 bis 10
for i in {1..10..2} Zahlenbereich mit Schrittweite 2 (1,3,5,7,9)
for file in *.txt Alle .txt-Dateien im aktuellen Verzeichnis
for user in $(cat users.txt) Ausgabe eines Befehls iterieren
for ((i=0; i<10; i++)) C-artige for-Schleife (mit Zähler)
Beispiele
# Zahlenbereich
for i in {1..5}; do
  echo "Zahl: $i"
done
# Schrittweite
for i in {0..10..2}; do
  echo "Gerade Zahl: $i"
done
# Dateien durchlaufen
for datei in *.log; do
  echo "Verarbeite: $datei"
  gzip $datei
done
# C-artige for-Schleife
for (( i=0; i<5; i++ )); do
  echo "Index: $i"
done
# Benutzernamen aus Datei
for user in $(cat users.txt); do
  echo "Benutzer: $user"
done
Tipp: Die C-artige for-Schleife ist besonders nützlich für numerische Iterationen mit komplexen Zählbedingungen.

while – Solange Bedingung wahr ist

while [ Bedingung ]; do ... done
while [ Bedingung ]; do ... done

while führt den Codeblock aus, solange die angegebene Bedingung wahr (Erfolgscode 0) ist. Ideal für zählergesteuerte Schleifen oder Datei-Eingabe.

Wichtige Anwendungen

Anwendung Beschreibung
while read -r line Zeilen aus einer Datei oder Pipe lesen
while true Endlosschleife (mit break beenden)
while [ $i -le 10 ] Zählergesteuerte Schleife
while getopts Optionen parsen (komplexere Skripte)
Beispiele
# Zählergesteuerte while-Schleife
i=1
while [ $i -le 5 ]; do
  echo "Durchlauf: $i"
  i=$((i + 1))
done
# Datei zeilenweise lesen
while read -r zeile; do
  echo "Zeile: $zeile"
done < datei.txt
# Endlosschleife (bis Abbruch)
while true; do
  echo "Drücke Strg+C zum Beenden"
  sleep 1
done
# Bedingung mit Datei-Prüfung
while [ ! -f "$datei" ]; do
  echo "Warte auf Datei $datei..."
  sleep 2
done
Tipp: while read -r line; do ... done < file ist die Standardmethode, um Textdateien zeilenweise zu verarbeiten – auch mit großen Dateien effizient.

until – Bis Bedingung wahr wird

until [ Bedingung ]; do ... done
until [ Bedingung ]; do ... done

until ist das Gegenteil von while: Der Code wird ausgeführt, solange die Bedingung falsch ist, und stoppt, sobald sie wahr wird.

Wichtige Anwendungen

Anwendung Beschreibung
until [ $i -gt 10 ] Führt aus, bis $i größer als 10 ist
until ping -c1 host Wartet, bis ein Host erreichbar ist
until -f datei Wartet, bis eine Datei existiert
Beispiele
# until mit Zähler
i=1
until [ $i -gt 5 ]; do
  echo "Zähler: $i"
  i=$((i + 1))
done
# Warten auf Netzwerk
until ping -c1 google.de >/dev/null 2>&1; do
  echo "Warte auf Internetverbindung..."
  sleep 5
done
echo "Verbindung besteht!"
# Warten auf Datei
until [ -f "/var/run/daemon.pid" ]; do
  echo "Warte auf PID-Datei..."
  sleep 2
done
Tipp: until ist perfekt für Warteschleifen, bei denen auf ein Ereignis gewartet wird (Datei, Netzwerk, Prozess).

Quick Summary

if-else
Bedingungen
case
Fallunterscheidung
for
Listen durchlaufen
while
Solange wahr
until
Bis wahr