EMZETT.
Login

Kurz: if prüft den Exit-Status eines Befehls. Meist ist das [[ … ]] (Bash-Test) oder test:

Teil des Kurses Bash

Kapitel 3 von 13 im Kurs Bash. Mit Fortschritt, Quiz und Zertifikat auf der Lernseite.

if / elif / else

if prüft den Exit-Status eines Befehls. Meist ist das [[ ... ]] (Bash-Test) oder test:

zahl=7
if [[ $zahl -gt 10 ]]; then
    echo "groß"
elif [[ $zahl -gt 5 ]]; then
    echo "mittel"
else
    echo "klein"
fi
 
if grep -q "bash" <<< "ich lerne bash"; then
    echo "gefunden"
fi
 
if ! command -v gibtsnicht >/dev/null; then
    echo "Programm fehlt"
fi

Ausgabe:

mittel
gefunden
Programm fehlt

Testoperatoren

ZahlenBedeutungTextBedeutung
-eq -negleich, ungleich== !=gleich, ungleich
-lt -lekleiner (gleich)< >alphabetisch
-gt -gegrößer (gleich)-z -nleer, nicht leer
=~passt auf Regex
DateitestBedeutung
-eexistiert
-f -dnormale Datei, Verzeichnis
-r -w -xlesbar, schreibbar, ausführbar
-snicht leer
-Lsymbolischer Link
a="Hallo"; b=""
[[ $a == "Hallo" ]] && echo "gleich"
[[ $a == H* ]] && echo "beginnt mit H (Muster)"
[[ -z $b ]] && echo "b ist leer"
[[ -n $a ]] && echo "a ist nicht leer"
[[ "apfel" < "birne" ]] && echo "alphabetisch kleiner"
[[ 2025-03-15 =~ ^([0-9]{4})-([0-9]{2}) ]] && echo "Jahr ${BASH_REMATCH[1]}, Monat ${BASH_REMATCH[2]}"
[[ 5 -gt 3 && 2 -lt 4 ]] && echo "beides wahr"
[[ 1 -eq 2 || -d / ]] && echo "mindestens eins wahr"
 
d=$(mktemp -d)
touch "$d/datei"
[[ -f "$d/datei" ]] && echo "ist Datei"
[[ -d "$d" ]] && echo "ist Ordner"
[[ -e "$d/nix" ]] || echo "existiert nicht"

Ausgabe:

gleich
beginnt mit H (Muster)
b ist leer
a ist nicht leer
alphabetisch kleiner
Jahr 2025, Monat 03
beides wahr
mindestens eins wahr
ist Datei
ist Ordner
existiert nicht

Tipp

In [[ ]] brauchst du keine Anführungszeichen um Variablen (kein Wort-Splitting), im alten [ ] schon. Bevorzuge [[ ]] in Bash-Skripten. Für Rechnen gibt es (( )): if (( zahl > 5 )); then.

n=12
if (( n % 2 == 0 )); then echo "gerade"; fi
(( n += 3 )); echo "$n"
(( n > 10 && n < 20 )) && echo "zwischen 10 und 20"

Ausgabe:

gerade
15
zwischen 10 und 20

case: Mustervergleich

eingabe="ja"
case "$eingabe" in
    ja|j|yes) echo "zugestimmt" ;;
    nein|n)   echo "abgelehnt" ;;
    [0-9]*)   echo "beginnt mit Ziffer" ;;
    *)        echo "unbekannt" ;;
esac
 
datei="foto.jpg"
case "${datei##*.}" in
    jpg|png|gif) echo "Bild" ;;
    txt|md)      echo "Text" ;;
    *)           echo "anderes" ;;
esac

Ausgabe:

zugestimmt
Bild

Standardwerte mit Parameter-Erweiterung

unset name
echo "${name:-Gast}"          # Ersatz, wenn leer/ungesetzt
echo "[$name]"
echo "${name:=Standard}"       # Ersatz und zuweisen
echo "[$name]"
echo "${name:+gesetzt}"        # Text nur, wenn gesetzt
echo "${neu:?Variable fehlt}" 2>&1 | head -1

Ausgabe:

Gast
[]
Standard
[Standard]
gesetzt

Merke

  • if wertet den Exit-Status eines Befehls aus
  • [[ ... ]] für Tests (Text, Zahlen, Dateien), (( ... )) zum Rechnen
  • Zahlen mit -eq -lt -gt, Text mit == !=, Muster mit == und =~
  • Dateitests: -f -d -e -r -w -x -s
  • case für Mustervergleiche; ${var:-standard} für Standardwerte

Übungsaufgabe

Schreibe ein Skript, das prüft, ob ein Pfad eine Datei, ein Ordner oder nicht vorhanden ist.

Quiz zur Selbstkontrolle

]?

  • Ob der Pfad ein Verzeichnis ist (richtig)
  • Ob der Pfad eine Datei ist
  • Ob der Pfad leer ist
  • Ob der Pfad schreibbar ist

Weiter im Kurs

Zurück: Variablen und Quoting

Weiter: Schleifen

Alle Kapitel: Bash im Überblick