if-Verzweigungen
- Die if-Struktur ist die zentrale Möglichkeit, in Bash bedingte Abläufe zu steuern.
- Sie ermöglicht es, Befehle nur dann auszuführen, wenn eine bestimmte Bedingung erfüllt ist.
Grundprinzip
- Die Bash prüft den Exit-Status eines Kommandos oder Tests:
0 bedeutet wahr, jeder andere Wert bedeutet falsch.
- Entsprechend werden die zugehörigen Befehle im then- oder else-Zweig ausgeführt.
Syntax
if [ Bedingung ]; then
Befehle bei wahr
fi
- if mit else
if [ Bedingung ]; then
Befehle bei wahr
else
Befehle bei falsch
fi
- Erweiterte Form mit elif
if [ Bedingung1 ]; then
Befehle bei wahr
elif [ Bedingung2 ]; then
Befehle bei zweiter Bedingung
else
Befehle bei sonst
fi
Beispiele
- Einfaches Beispiel ohne else
if [ -f /etc/passwd ]; then
echo "Datei existiert"
fi
Ausgabe:
Datei existiert
- Einfaches Beispiel mit else
if [ -f /etc/passwd ]; then
echo "Datei existiert"
else
echo "Datei nicht gefunden"
fi
Ausgabe:
Datei existiert
- Beispiel mit Benutzerabfrage
NAME=$USER
if [ "$NAME" = "root" ]; then
echo "Administrator erkannt"
else
echo "Normaler Benutzer"
fi
Ausgabe:
Normaler Benutzer
- Beispiel mit elif
echo "Bitte Zahl eingeben:"
read ZAHL
if [ "$ZAHL" -lt 0 ]; then
echo "Negativ"
elif [ "$ZAHL" -eq 0 ]; then
echo "Null"
else
echo "Positiv"
fi
Überprüfung des Rückgabewerts
- Der letzte ausgeführte Test oder Befehl liefert einen Rückgabewert, der mit echo $? angezeigt werden kann.
- Ein Exit-Status von 0 bedeutet „Bedingung erfüllt“, ein anderer Wert „Bedingung nicht erfüllt“.
- Beispiel
[ -d /etc ]
echo $?
0
[ -d /nichtda ]
echo $?
1
Hinweise
- Die Klammern [ ] sind ein Synonym für den Befehl test.
- Leerzeichen zwischen den eckigen Klammern und der Bedingung sind Pflicht.
- Es dürfen einfache oder doppelte Anführungszeichen verwendet werden, um Leerzeichen oder Sonderzeichen zu schützen.
- Für numerische Vergleiche werden Operatoren wie -eq, -lt, -gt usw. verwendet.
- Für Stringvergleiche werden = und != genutzt.
Erweiterte Syntax mit [[ ... ]]
- Die doppelten Klammern [[ ... ]] sind eine modernere Variante mit erweiterten Vergleichsmöglichkeiten.
- Sie unterstützen z. B. Mustervergleiche (Globbing) und logische Operatoren ohne Maskierung.
- Beispiel
NAME="Thomas"
if [[ $NAME == Th* ]]; then
echo "Name beginnt mit Th"
fi
Typische Fehlerquellen
- Fehlende Leerzeichen nach [ oder vor ].
- Unbeabsichtigte Auswertung leerer Variablen → in Anführungszeichen setzen!
- Falsche Vergleichsoperatoren (z. B. = statt -eq bei Zahlen).
Aufgaben
- Erstellen Sie ein Skript, das prüft, ob eine Datei /etc/passwd existiert, und eine passende Meldung ausgibt.
- Erstellen Sie ein Skript, das prüft, ob eine Variable NAME den Wert „root“ enthält, und entsprechende Ausgaben erzeugt.
- Erweitern Sie die Abfrage mit elif, sodass drei Zustände unterschieden werden (z. B. positiv, null, negativ).
- Geben Sie bei jeder Bedingung den Rückgabewert mit echo $? aus.
- Testen Sie die Unterschiede zwischen [ ... ] und [[ ... ]].