Beim Schreiben von Bash-Skripten prüfst du regelmäßig, ob zwei Strings identisch sind, ob ein String einen bestimmten Text enthält oder ob eine Variable leer ist. Bash bietet dafür mehrere Vergleichsoperatoren.

Vergleichsoperatoren im Überblick

OperatorBedeutung
= oder ==Strings sind identisch
!=Strings sind unterschiedlich
=~String passt auf regulären Ausdruck
< / >Lexikografischer Vergleich
-zString ist leer
-nString ist nicht leer

Drei Regeln für fehlerfreie Vergleiche:

  1. Setze Variablen immer in doppelte Anführungszeichen: "$VAR"
  2. Halte Leerzeichen um den Operator ein
  3. Verwende [[ statt [ für Mustervergleiche

Zwei Strings auf Gleichheit prüfen

Der häufigste Fall: Du willst wissen, ob zwei Strings identisch sind.

#!/bin/bash

name="Linux"
system="Linux"

if [[ "$name" == "$system" ]]; then
    echo "Identisch"
else
    echo "Unterschiedlich"
fi

Ausgabe:

Identisch

Für einfache Vergleiche funktioniert auch die kürzere Variante mit [ und =:

if [ "$name" = "$system" ]; then
    echo "Identisch"
fi

Unterschied: Der [[-Befehl ist moderner und unterstützt Mustervergleiche. Bei [ musst du = statt == verwenden.

Ungleichheit prüfen

Mit != prüfst du, ob zwei Strings unterschiedlich sind:

#!/bin/bash

eingabe="Ubuntu"
erwartet="Debian"

if [[ "$eingabe" != "$erwartet" ]]; then
    echo "Die Eingabe entspricht nicht dem erwarteten Wert."
fi

Prüfen, ob ein String einen Teilstring enthält

Du kannst mit Wildcards (*) prüfen, ob ein String einen bestimmten Text enthält:

#!/bin/bash

text="GNU/Linux ist ein Betriebssystem"

if [[ "$text" == *"Linux"* ]]; then
    echo "Text enthält 'Linux'"
fi

Die Sternchen stehen für beliebige Zeichen vor und nach dem Suchbegriff.

Alternative: Regulärer Ausdruck

Mit dem Operator =~ verwendest du reguläre Ausdrücke:

#!/bin/bash

text="Fehler: Datei nicht gefunden"

if [[ "$text" =~ ^Fehler ]]; then
    echo "Text beginnt mit 'Fehler'"
fi

Der Ausdruck ^Fehler prüft, ob der String mit “Fehler” beginnt.

Prüfen, ob ein String leer ist

Mit -z prüfst du auf einen leeren String:

#!/bin/bash

eingabe=""

if [[ -z "$eingabe" ]]; then
    echo "Keine Eingabe vorhanden"
fi

Das Gegenteil: Mit -n prüfst du, ob ein String Inhalt hat:

#!/bin/bash

name="admin"

if [[ -n "$name" ]]; then
    echo "Name wurde gesetzt: $name"
fi

Mehrere Werte mit case prüfen

Bei mehreren möglichen Werten ist case übersichtlicher als verschachtelte if-Abfragen:

#!/bin/bash

distro="Fedora"

case "$distro" in
    "Ubuntu" | "Debian")
        echo "Debian-basiert"
        ;;
    "Fedora" | "CentOS")
        echo "Red-Hat-basiert"
        ;;
    "Arch Linux")
        echo "Arch-basiert"
        ;;
    *)
        echo "Unbekannte Distribution"
        ;;
esac

Ausgabe:

Red-Hat-basiert

Das Pipe-Zeichen | trennt alternative Muster. Der Stern * am Ende fängt alle nicht genannten Fälle ab.

Kurzform mit && und ||

Für einfache Prüfungen in einer Zeile:

[[ "$user" == "root" ]] && echo "Administrator" || echo "Normaler Benutzer"

Nach && folgt der Befehl für den Erfolgsfall, nach || der für den Fehlerfall.

Lexikografischer Vergleich

Mit < und > vergleichst du Strings alphabetisch:

#!/bin/bash

a="apple"
b="banana"

if [[ "$a" < "$b" ]]; then
    echo "'$a' kommt vor '$b'"
fi

Dieser Vergleich basiert auf der ASCII-Reihenfolge. Kleinbuchstaben kommen nach Großbuchstaben.

Zusammenfassung

AufgabeSyntax
Gleichheit[[ "$a" == "$b" ]]
Ungleichheit[[ "$a" != "$b" ]]
Enthält Teilstring[[ "$a" == *"text"* ]]
Regex-Prüfung[[ "$a" =~ muster ]]
Leer[[ -z "$a" ]]
Nicht leer[[ -n "$a" ]]

Setze Variablen immer in Anführungszeichen. So vermeidest du Fehler bei leeren Werten oder Strings mit Leerzeichen.