Vergleiche
Grundprinzip
- Vergleiche werden in der Shell verwendet, um Bedingungen zu prüfen und Entscheidungen zu treffen.*
- Das Ergebnis eines Vergleichs ist immer ein Wahrheitswert – also „wahr“ (Exit-Status 0) oder „falsch“ (Exit-Status ≠ 0).*
- Die Shell speichert diesen Rückgabewert in der Spezialvariablen $?.*
- Damit lässt sich leicht prüfen, ob ein Vergleich oder Befehl erfolgreich war.*
- Beispiele
0
1
Logische Verknüpfungen
- In der Bash können Befehle mit den Operatoren && (UND) und || (ODER) logisch verknüpft werden.
- Diese Operatoren prüfen den Exit-Status des vorherigen Befehls und entscheiden, ob der nächste ausgeführt wird.
| Operator |
Bedeutung |
Beispiel |
Erklärung
|
| && |
Führt den nächsten Befehl nur aus, wenn der vorherige erfolgreich war (Exit-Status = 0). |
[ 5 -eq 5 ] && echo "gleich" |
„gleich“ wird nur ausgegeben, wenn die Bedingung wahr ist.
|
| \| |
Führt den nächsten Befehl nur aus, wenn der vorherige **nicht** erfolgreich war (Exit-Status ≠ 0). |
\| echo "nicht ungleich" |
„nicht ungleich“ wird nur ausgegeben, wenn die Bedingung falsch ist.
|
- Beispiele
- [ "$NAME" = "Thomas" ] && echo "Hallo Thomas"
Hallo Thomas
- [ -z "$NAME" ] && echo "leer" || echo "nicht leer"
nicht leer
Das klassische test-Kommando
- Das Kommando test prüft Bedingungen und liefert einen passenden Exit-Status zurück.
- Die Schreibweise mit einfachen eckigen Klammern [ ... ] ist nur eine Kurzform von test.
- Beide Varianten sind gleichwertig.
- Beispiele
- test 5 -eq 5
- [ 5 -eq 5 ]
- echo $?
0
Numerische Vergleiche
| Operator |
Bedeutung
|
| -eq |
gleich
|
| -ne |
ungleich
|
| -lt |
kleiner („less than“)
|
| -le |
kleiner oder gleich
|
| -gt |
größer („greater than“)
|
| -ge |
größer oder gleich
|
- Beispiel
- ZAHL=10
- [ $ZAHL -gt 5 ] && echo "Größer als 5"
Größer als 5
Zeichenkettenvergleiche
| Operator |
Bedeutung
|
| = |
Zeichenketten sind gleich
|
| != |
Zeichenketten sind ungleich
|
| -z STRING |
wahr, wenn String leer ist
|
| -n STRING |
wahr, wenn String nicht leer ist
|
- Beispiele
- NAME="Thomas"
- [ "$NAME" = "Thomas" ] && echo "Hallo Thomas"
Hallo Thomas
- [ -z "$NAME" ] && echo "leer" || echo "nicht leer"
nicht leer
Datei- und Verzeichnisvergleiche
| Operator |
Bedeutung
|
| -e DATEI |
Datei existiert (egal welcher Typ)
|
| -f DATEI |
reguläre Datei existiert
|
| -d DATEI |
Verzeichnis existiert
|
| -r DATEI |
Datei ist lesbar
|
| -w DATEI |
Datei ist schreibbar
|
| -x DATEI |
Datei ist ausführbar
|
| FILE1 -nt FILE2 |
FILE1 ist neuer als FILE2
|
| FILE1 -ot FILE2 |
FILE1 ist älter als FILE2
|
- Beispiele
- [ -d /etc ] && echo "Verzeichnis vorhanden"
Verzeichnis vorhanden
- [ -f /bin/bash ] && echo "Datei existiert"
Datei existiert
- [ /etc/passwd -nt /etc/group ] && echo "passwd ist neuer"
Erweiterte Syntax mit [[ ... ]]
- Bash bietet neben dem klassischen Test-Kommando auch die erweiterte Syntax ... .
- Diese wird direkt von der Shell interpretiert und gilt als robuster und moderner.
- Sie verhindert viele typische Syntaxfehler und erlaubt eine klarere Schreibweise.
- Wichtige Unterschiede zu [ ... ]
| Merkmal |
[ ... ] |
[[ ... ]]
|
| Herkunft |
POSIX-Standard |
Bash-spezifische Erweiterung
|
| Leerzeichen |
Müssen exakt gesetzt werden |
Toleranter, weniger fehleranfällig
|
| Variablen mit Leerzeichen |
Müssen in Anführungszeichen gesetzt werden |
Dürfen unquoted sein (empfohlen: trotzdem quoten)
|
| logische Operatoren |
-a und -o |
\|
|
| Mustervergleiche |
Nur exakte Übereinstimmung |
Unterstützt Wildcards (z. B. == Th*)
|
| Reguläre Ausdrücke |
Nicht unterstützt |
Möglich mit =~
|
- Beispielvergleich
- NAME="Thomas"
- [ "$NAME" = "Thomas" ] && echo "klassischer Test"
klassischer Test
- [[ $NAME == Th* ]] && echo "beginnt mit Th"
beginnt mit Th
Kombination mehrerer Bedingungen
- Mit logischen Operatoren können mehrere Tests in einer Zeile kombiniert werden:
- -a → logisches UND
- -o → logisches ODER
- ! → logische Negation
- Beispiele
- [ -f /etc/passwd -a -r /etc/passwd ] && echo "Existiert und ist lesbar"
Existiert und ist lesbar
- [ -d /tmp -o -d /var/tmp ] && echo "Mindestens eines existiert"
Mindestens eines existiert
- [ ! -d /root ] && echo "/root ist kein Verzeichnis"
/root ist kein Verzeichnis
Zusammenfassung
- Vergleiche liefern keinen Text, sondern einen Exit-Status.
- Dieser Status kann mit echo $? überprüft werden.
- Ein Exit-Status von 0 bedeutet „wahr“ – alles andere „falsch“.
- [[ ... ]] ist die moderne und robustere Variante, bleibt aber Bash-spezifisch.
- Darauf bauen alle weiteren Kontrollstrukturen wie if, while und for auf.
Aufgaben
- Prüfen Sie mit test, ob eine Datei existiert.
- Prüfen Sie, ob eine Variable leer ist.
- Vergleichen Sie zwei Zahlen und geben Sie eine Meldung aus, wenn die erste größer ist.
- Schreiben Sie eine Befehlszeile, die „OK“ ausgibt, wenn /etc/passwd existiert und lesbar ist.
- Wiederholen Sie diese Aufgabe mit der modernen Syntax ... .
- Überprüfen Sie mit echo $?, ob Ihr letzter Test erfolgreich war.