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 den if-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:

OperatorBeschreibung
-f DATEIWahr, wenn DATEI eine reguläre Datei ist
-d DATEIWahr, wenn DATEI ein Verzeichnis ist
-e DATEIWahr, wenn DATEI existiert (beliebiger Typ)
-r DATEIWahr, wenn DATEI lesbar ist
-w DATEIWahr, wenn DATEI beschreibbar ist
-x DATEIWahr, wenn DATEI ausführbar ist
-s DATEIWahr, wenn DATEI existiert und nicht leer ist

Zeichenketten-Tests:

OperatorBeschreibung
-z STRINGWahr, wenn STRING leer ist
-n STRINGWahr, wenn STRING nicht leer ist
STRING1 == STRING2Wahr, wenn beide Strings gleich sind
STRING1 != STRING2Wahr, wenn die Strings unterschiedlich sind

Zahlen-Vergleiche:

OperatorBeschreibung
-eqGleich (equal)
-neUngleich (not equal)
-gtGrößer als (greater than)
-geGrößer oder gleich (greater or equal)
-ltKleiner als (less than)
-leKleiner oder gleich (less or equal)

Eckige Klammern: [ ] vs [[ ]]

Bash kennt zwei Formen von Test-Klammern:

  • [ ] - Der klassische test-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.

Verwandte Artikel