Vergleiche: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 133: | Zeile 133: | ||
| Variablen mit Leerzeichen || Müssen in Anführungszeichen gesetzt werden || Dürfen unquoted sein (empfohlen: trotzdem quoten) | | Variablen mit Leerzeichen || Müssen in Anführungszeichen gesetzt werden || Dürfen unquoted sein (empfohlen: trotzdem quoten) | ||
|- | |- | ||
| − | | logische Operatoren || -a und -o || && und | + | | logische Operatoren || -a und -o || <nowiki>&& und ||</nowiki> |
|- | |- | ||
| Mustervergleiche || Nur exakte Übereinstimmung || Unterstützt Wildcards (z. B. == Th*) | | Mustervergleiche || Nur exakte Übereinstimmung || Unterstützt Wildcards (z. B. == Th*) | ||
Aktuelle Version vom 25. November 2025, 13:25 Uhr
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
- test 5 -eq 5
- echo $?
0
- test 5 -lt 3
- echo $?
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). | [ 5 -ne 5 ] || 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 | && und || |
| 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.