Die if-Anweisung ermöglicht es, Code in Bash-Skripten nur dann auszuführen, wenn eine bestimmte Bedingung erfüllt ist. Zusammen mit else und elif lassen sich damit Verzweigungen bauen, die den Ablauf eines Skripts steuern.
Syntax der if-Anweisung
Die grundlegende Struktur einer if-Anweisung sieht so aus:
if BEDINGUNG
then
BEFEHLE
fi
BEDINGUNG- Ein Ausdruck, der als wahr oder falsch ausgewertet wird.BEFEHLE- Die Befehle, die bei erfüllter Bedingung ausgeführt werden.fi- Schließt denif-Block ab (rückwärts geschriebenes „if").
Wird die Bedingung als wahr ausgewertet, führt Bash die Befehle im then-Block aus. Bei einer falschen Bedingung wird der Block übersprungen.
Einfache if-Anweisung
Das folgende Skript prüft, ob eine Datei existiert:
#!/bin/bash
datei="/etc/passwd"
if [[ -f "$datei" ]]
then
echo "Die Datei $datei existiert."
fi
Der Test -f prüft, ob der angegebene Pfad eine reguläre Datei ist. Existiert die Datei, erscheint die Meldung.
if-else: Alternative bei falscher Bedingung
Mit else legst du fest, was passieren soll, wenn die Bedingung nicht erfüllt ist:
if BEDINGUNG
then
BEFEHLE_WAHR
else
BEFEHLE_FALSCH
fi
Ein Beispiel, das prüft, ob ein Verzeichnis existiert:
#!/bin/bash
verzeichnis="/var/log/myapp"
if [[ -d "$verzeichnis" ]]
then
echo "Das Verzeichnis existiert."
else
echo "Das Verzeichnis existiert nicht."
fi
Der Test -d prüft, ob der Pfad ein Verzeichnis ist.
if-elif-else: Mehrere Bedingungen prüfen
Mit elif (kurz für „else if") kannst du mehrere Bedingungen nacheinander prüfen:
if BEDINGUNG1
then
BEFEHLE1
elif BEDINGUNG2
then
BEFEHLE2
else
BEFEHLE3
fi
Die Bedingungen werden von oben nach unten ausgewertet. Sobald eine Bedingung wahr ist, wird der zugehörige Block ausgeführt und die restlichen Bedingungen übersprungen.
#!/bin/bash
temperatur=25
if [[ $temperatur -gt 30 ]]
then
echo "Es ist heiß."
elif [[ $temperatur -gt 20 ]]
then
echo "Es ist angenehm warm."
elif [[ $temperatur -gt 10 ]]
then
echo "Es ist kühl."
else
echo "Es ist kalt."
fi
Bei einer Temperatur von 25 gibt das Skript „Es ist angenehm warm." aus.
Verschachtelte if-Anweisungen
Du kannst if-Anweisungen ineinander verschachteln, um komplexere Logik abzubilden:
#!/bin/bash
alter=25
fuehrerschein="ja"
if [[ $alter -ge 18 ]]
then
if [[ "$fuehrerschein" == "ja" ]]
then
echo "Du darfst Auto fahren."
else
echo "Du bist alt genug, hast aber keinen Führerschein."
fi
else
echo "Du bist zu jung zum Autofahren."
fi
Bei zu vielen Verschachtelungen wird der Code schwer lesbar. In solchen Fällen sind logische Operatoren oder die case-Anweisung oft die bessere Wahl.
Mehrere Bedingungen verknüpfen
Mit den logischen Operatoren && (UND) und || (ODER) kannst du mehrere Bedingungen in einer Zeile kombinieren:
#!/bin/bash
datei="/var/log/syslog"
if [[ -f "$datei" ]] && [[ -r "$datei" ]]
then
echo "Die Datei existiert und ist lesbar."
fi
Das Skript prüft, ob die Datei existiert (-f) UND lesbar ist (-r). Beide Bedingungen müssen wahr sein.
Mit ODER reicht es, wenn eine der Bedingungen zutrifft:
#!/bin/bash
stunde=$(date +%H)
if [[ $stunde -lt 6 ]] || [[ $stunde -gt 22 ]]
then
echo "Es ist Nacht."
fi
Test-Operatoren
Bash bietet verschiedene Operatoren für Tests. Die wichtigsten im Überblick:
Datei-Tests:
| Operator | Beschreibung |
|---|---|
-f DATEI | Wahr, wenn DATEI eine reguläre Datei ist |
-d DATEI | Wahr, wenn DATEI ein Verzeichnis ist |
-e DATEI | Wahr, wenn DATEI existiert (beliebiger Typ) |
-r DATEI | Wahr, wenn DATEI lesbar ist |
-w DATEI | Wahr, wenn DATEI beschreibbar ist |
-x DATEI | Wahr, wenn DATEI ausführbar ist |
-s DATEI | Wahr, wenn DATEI existiert und nicht leer ist |
Zeichenketten-Tests:
| Operator | Beschreibung |
|---|---|
-z STRING | Wahr, wenn STRING leer ist |
-n STRING | Wahr, wenn STRING nicht leer ist |
STRING1 == STRING2 | Wahr, wenn beide Strings gleich sind |
STRING1 != STRING2 | Wahr, wenn die Strings unterschiedlich sind |
Zahlen-Vergleiche:
| Operator | Beschreibung |
|---|---|
-eq | Gleich (equal) |
-ne | Ungleich (not equal) |
-gt | Größer als (greater than) |
-ge | Größer oder gleich (greater or equal) |
-lt | Kleiner als (less than) |
-le | Kleiner oder gleich (less or equal) |
Eckige Klammern: [ ] vs [[ ]]
Bash kennt zwei Formen von Test-Klammern:
[ ]- Der klassischetest-Befehl, POSIX-kompatibel[[ ]]- Erweiterte Bash-Syntax mit mehr Funktionen
Die doppelten Klammern [[ ]] bieten Vorteile: Sie verhindern Wortaufteilung bei Variablen, unterstützen Pattern-Matching mit == und ermöglichen den Operator =~ für reguläre Ausdrücke.
#!/bin/bash
eingabe="Hallo123"
if [[ "$eingabe" =~ ^[A-Za-z]+[0-9]+$ ]]
then
echo "Die Eingabe enthält Buchstaben gefolgt von Zahlen."
fi
Für maximale Portabilität (andere Shells) verwende [ ]. Für reine Bash-Skripte sind [[ ]] die bessere Wahl.
Kompakte Schreibweise
Du kannst if und then auch in eine Zeile schreiben, getrennt durch ein Semikolon:
if [[ -f "/etc/hosts" ]]; then echo "Datei gefunden."; fi
Diese Schreibweise eignet sich für kurze Einzeiler. Bei längeren Skripten ist die mehrzeilige Form übersichtlicher.
Zusammenfassung
Mit if, elif und else steuerst du den Ablauf von Bash-Skripten basierend auf Bedingungen. Die Test-Operatoren prüfen Dateieigenschaften, vergleichen Zeichenketten oder Zahlen. Logische Operatoren wie && und || ermöglichen komplexere Abfragen. Für reine Bash-Skripte bieten die doppelten Klammern [[ ]] die meisten Funktionen und sind weniger fehleranfällig.