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
| Operator | Bedeutung |
|---|---|
= oder == | Strings sind identisch |
!= | Strings sind unterschiedlich |
=~ | String passt auf regulären Ausdruck |
< / > | Lexikografischer Vergleich |
-z | String ist leer |
-n | String ist nicht leer |
Drei Regeln für fehlerfreie Vergleiche:
- Setze Variablen immer in doppelte Anführungszeichen:
"$VAR" - Halte Leerzeichen um den Operator ein
- 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
| Aufgabe | Syntax |
|---|---|
| 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.