Kontrollstrukturen
Bedingte Ausführung
Abschnitt betitelt „Bedingte Ausführung“if / elif / else
Abschnitt betitelt „if / elif / else“if bedingung; then # ...elif andere-bedingung; then # ...else # ...fiAls Bedingung dient ein beliebiger Befehl – sein Exit-Code entscheidet: 0 = wahr, alles andere = falsch.
if grep -q "root" /etc/passwd; then echo "root-Eintrag gefunden"fi
if cp quelle.txt ziel/; then echo "Kopieren erfolgreich"else echo "Fehler beim Kopieren" >&2fi[[...]] – Bedingungsausdrücke
Abschnitt betitelt „[[...]] – Bedingungsausdrücke“[[...]] ist die bash-eigene Syntax für Tests – sicherer und mächtiger als das ältere [...]:
# Dateisystemif [[ -f "$DATEI" ]]; then echo "Datei existiert"; fiif [[ -d "$VERZ" ]]; then echo "Verzeichnis existiert"; fiif [[ -e "$PFAD" ]]; then echo "Pfad existiert (Datei oder Verz.)"; fiif [[ -r "$DATEI" ]]; then echo "Datei ist lesbar"; fiif [[ -x "$DATEI" ]]; then echo "Datei ist ausführbar"; fiif [[ -s "$DATEI" ]]; then echo "Datei ist nicht leer"; fi
# Stringsif [[ -z "$VAR" ]]; then echo "leer"; fi # zero lengthif [[ -n "$VAR" ]]; then echo "nicht leer"; fi # non-zero lengthif [[ "$A" == "$B" ]]; then echo "gleich"; fiif [[ "$A" != "$B" ]]; then echo "ungleich"; fiif [[ "$A" =~ ^[0-9]+$ ]]; then echo "nur Ziffern"; fi # Regex-Match
# Zahlenif [[ "$A" -eq "$B" ]]; then echo "gleich"; fi # equalif [[ "$A" -ne "$B" ]]; then echo "ungleich"; fi # not equalif [[ "$A" -lt "$B" ]]; then echo "kleiner"; fi # less thanif [[ "$A" -gt "$B" ]]; then echo "größer"; fi # greater thanVerknüpfungen:
if [[ -f "$DATEI" && -r "$DATEI" ]]; then echo "Datei existiert und ist lesbar"fi
if [[ -z "$1" || "$1" == "--help" ]]; then echo "Hilfe..."ficase – Mehrfachauswahl
Abschnitt betitelt „case – Mehrfachauswahl“Übersichtlicher als verschachtelte if-Ketten bei vielen Möglichkeiten:
case "$1" in start) echo "Dienst wird gestartet..." ;; stop|halt) # mehrere Muster mit | echo "Dienst wird gestoppt..." ;; restart) echo "Neustart..." ;; --help|-h) echo "Verwendung: $0 {start|stop|restart}" ;; *) # Standardfall (wie else) echo "Unbekannte Option: $1" >&2 exit 1 ;;esacKurzschlussoperatoren && und ||
Abschnitt betitelt „Kurzschlussoperatoren && und ||“mkdir -p "$ZIEL" && cp "$QUELLE" "$ZIEL" # cp nur wenn mkdir erfolgreichping -c1 host.de || echo "Host nicht erreichbar"
# Häufiges Muster für Fehlerbehandlung:[[ -f "$DATEI" ]] || { echo "Datei fehlt: $DATEI" >&2; exit 1; }Schleifen
Abschnitt betitelt „Schleifen“for – über eine Liste iterieren
Abschnitt betitelt „for – über eine Liste iterieren“# Liste von Wertenfor FARBE in rot grün blau; do echo "$FARBE"done
# Dateien mit Globfor DATEI in /var/log/*.log; do echo "Verarbeite: $DATEI"done
# Positionsparameterfor ARG in "$@"; do echo "Argument: $ARG"done
# Zahlenbereichfor I in {1..10}; do echo "Schritt $I"done
# C-Stilfor (( I=0; I<10; I++ )); do echo "$I"donewhile – solange Bedingung wahr
Abschnitt betitelt „while – solange Bedingung wahr“ZÄHLER=0while [[ "$ZÄHLER" -lt 5 ]]; do echo "Zähler: $ZÄHLER" (( ZÄHLER++ ))done
# Datei zeilenweise einlesenwhile IFS= read -r ZEILE; do echo "Zeile: $ZEILE"done < datei.txt
# Auf Ereignis wartenwhile ! ping -c1 server.de &>/dev/null; do echo "Warte auf server.de..." sleep 5doneecho "Server erreichbar!"break und continue
Abschnitt betitelt „break und continue“for DATEI in /tmp/*.tmp; do [[ ! -f "$DATEI" ]] && continue # Nächste Iteration, falls kein Treffer [[ $(wc -c < "$DATEI") -eq 0 ]] && continue # Leere Dateien überspringen echo "Lösche: $DATEI" rm "$DATEI"done
# Schleife nach erstem Treffer verlassenfor HOST in server1 server2 server3; do if ping -c1 "$HOST" &>/dev/null; then echo "Erster erreichbarer Host: $HOST" break fidone