Zum Inhalt springen

Kontrollstrukturen

Terminal-Fenster
if bedingung; then
# ...
elif andere-bedingung; then
# ...
else
# ...
fi

Als Bedingung dient ein beliebiger Befehl – sein Exit-Code entscheidet: 0 = wahr, alles andere = falsch.

Terminal-Fenster
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" >&2
fi

[[...]] ist die bash-eigene Syntax für Tests – sicherer und mächtiger als das ältere [...]:

Terminal-Fenster
# Dateisystem
if [[ -f "$DATEI" ]]; then echo "Datei existiert"; fi
if [[ -d "$VERZ" ]]; then echo "Verzeichnis existiert"; fi
if [[ -e "$PFAD" ]]; then echo "Pfad existiert (Datei oder Verz.)"; fi
if [[ -r "$DATEI" ]]; then echo "Datei ist lesbar"; fi
if [[ -x "$DATEI" ]]; then echo "Datei ist ausführbar"; fi
if [[ -s "$DATEI" ]]; then echo "Datei ist nicht leer"; fi
# Strings
if [[ -z "$VAR" ]]; then echo "leer"; fi # zero length
if [[ -n "$VAR" ]]; then echo "nicht leer"; fi # non-zero length
if [[ "$A" == "$B" ]]; then echo "gleich"; fi
if [[ "$A" != "$B" ]]; then echo "ungleich"; fi
if [[ "$A" =~ ^[0-9]+$ ]]; then echo "nur Ziffern"; fi # Regex-Match
# Zahlen
if [[ "$A" -eq "$B" ]]; then echo "gleich"; fi # equal
if [[ "$A" -ne "$B" ]]; then echo "ungleich"; fi # not equal
if [[ "$A" -lt "$B" ]]; then echo "kleiner"; fi # less than
if [[ "$A" -gt "$B" ]]; then echo "größer"; fi # greater than

Verknüpfungen:

Terminal-Fenster
if [[ -f "$DATEI" && -r "$DATEI" ]]; then
echo "Datei existiert und ist lesbar"
fi
if [[ -z "$1" || "$1" == "--help" ]]; then
echo "Hilfe..."
fi

Übersichtlicher als verschachtelte if-Ketten bei vielen Möglichkeiten:

Terminal-Fenster
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
;;
esac
Terminal-Fenster
mkdir -p "$ZIEL" && cp "$QUELLE" "$ZIEL" # cp nur wenn mkdir erfolgreich
ping -c1 host.de || echo "Host nicht erreichbar"
# Häufiges Muster für Fehlerbehandlung:
[[ -f "$DATEI" ]] || { echo "Datei fehlt: $DATEI" >&2; exit 1; }
Terminal-Fenster
# Liste von Werten
for FARBE in rot grün blau; do
echo "$FARBE"
done
# Dateien mit Glob
for DATEI in /var/log/*.log; do
echo "Verarbeite: $DATEI"
done
# Positionsparameter
for ARG in "$@"; do
echo "Argument: $ARG"
done
# Zahlenbereich
for I in {1..10}; do
echo "Schritt $I"
done
# C-Stil
for (( I=0; I<10; I++ )); do
echo "$I"
done
Terminal-Fenster
ZÄHLER=0
while [[ "$ZÄHLER" -lt 5 ]]; do
echo "Zähler: $ZÄHLER"
(( ZÄHLER++ ))
done
# Datei zeilenweise einlesen
while IFS= read -r ZEILE; do
echo "Zeile: $ZEILE"
done < datei.txt
# Auf Ereignis warten
while ! ping -c1 server.de &>/dev/null; do
echo "Warte auf server.de..."
sleep 5
done
echo "Server erreichbar!"
Terminal-Fenster
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 verlassen
for HOST in server1 server2 server3; do
if ping -c1 "$HOST" &>/dev/null; then
echo "Erster erreichbarer Host: $HOST"
break
fi
done