Vergleiche: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| (7 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
| Zeile 1: | Zeile 1: | ||
| − | |||
== Grundprinzip == | == Grundprinzip == | ||
| − | *Vergleiche werden in der Shell verwendet, um Bedingungen zu prüfen und Entscheidungen zu treffen. | + | *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). | + | *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 '''$?'''. | + | *Die Shell speichert diesen Rückgabewert in der Spezialvariablen '''$?'''. |
| − | *Damit lässt sich leicht prüfen, ob ein Vergleich oder Befehl erfolgreich war. | + | *Damit lässt sich leicht prüfen, ob ein Vergleich oder Befehl erfolgreich war. |
;Beispiele | ;Beispiele | ||
| Zeile 15: | Zeile 14: | ||
* test 5 -lt 3 | * test 5 -lt 3 | ||
* echo $? | * echo $? | ||
| − | 1 | + | 1 |
== Logische Verknüpfungen == | == Logische Verknüpfungen == | ||
| Zeile 27: | Zeile 26: | ||
| && || 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 erfolgreich war (Exit-Status = 0). || [ 5 -eq 5 ] && echo "gleich" || „gleich“ wird nur ausgegeben, wenn die Bedingung wahr ist. | ||
|- | |- | ||
| − | | | + | | <nowiki>||</nowiki> || Führt den nächsten Befehl nur aus, wenn der vorherige **nicht** erfolgreich war (Exit-Status ≠ 0). || [ 5 -ne 5 ] <nowiki>||</nowiki> echo "nicht ungleich" || „nicht ungleich“ wird nur ausgegeben, wenn die Bedingung falsch ist. |
|} | |} | ||
| Zeile 120: | Zeile 119: | ||
== Erweiterte Syntax mit <nowiki>[[ ... ]]</nowiki> == | == Erweiterte Syntax mit <nowiki>[[ ... ]]</nowiki> == | ||
| − | *Bash bietet neben dem klassischen Test-Kommando auch die erweiterte Syntax '''[[ ... ]]'''. | + | *Bash bietet neben dem klassischen Test-Kommando auch die erweiterte Syntax '''[[ ... ]]'''. |
| − | *Diese wird direkt von der Shell interpretiert und gilt als robuster und moderner. | + | *Diese wird direkt von der Shell interpretiert und gilt als robuster und moderner. |
| − | *Sie verhindert viele typische Syntaxfehler und erlaubt eine klarere Schreibweise. | + | *Sie verhindert viele typische Syntaxfehler und erlaubt eine klarere Schreibweise. |
;Wichtige Unterschiede zu [ ... ] | ;Wichtige Unterschiede zu [ ... ] | ||
| Zeile 134: | 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*) | ||
| Zeile 149: | Zeile 148: | ||
== Kombination mehrerer Bedingungen == | == Kombination mehrerer Bedingungen == | ||
| − | *Mit logischen Operatoren können mehrere Tests in einer Zeile kombiniert werden: | + | *Mit logischen Operatoren können mehrere Tests in einer Zeile kombiniert werden: |
* '''-a''' → logisches UND | * '''-a''' → logisches UND | ||
* '''-o''' → logisches ODER | * '''-o''' → logisches ODER | ||
| Zeile 160: | Zeile 159: | ||
Mindestens eines existiert | Mindestens eines existiert | ||
* [ ! -d /root ] && echo "/root ist kein Verzeichnis" | * [ ! -d /root ] && echo "/root ist kein Verzeichnis" | ||
| − | /root ist kein Verzeichnis | + | /root ist kein Verzeichnis |
== Zusammenfassung == | == Zusammenfassung == | ||
| − | *Vergleiche liefern keinen Text, sondern einen Exit-Status. | + | *Vergleiche liefern keinen Text, sondern einen Exit-Status. |
| − | *Dieser Status kann mit '''echo $?''' überprüft werden. | + | *Dieser Status kann mit '''echo $?''' überprüft werden. |
| − | *Ein Exit-Status von 0 bedeutet „wahr“ – alles andere „falsch“. | + | *Ein Exit-Status von 0 bedeutet „wahr“ – alles andere „falsch“. |
| − | *'''<nowiki>[[ ... ]]</nowiki>''' ist die moderne und robustere Variante, bleibt aber Bash-spezifisch. | + | *'''<nowiki>[[ ... ]]</nowiki>''' ist die moderne und robustere Variante, bleibt aber Bash-spezifisch. |
| − | *Darauf bauen alle weiteren Kontrollstrukturen wie '''if''', '''while''' und '''for''' auf. | + | *Darauf bauen alle weiteren Kontrollstrukturen wie '''if''', '''while''' und '''for''' auf. |
== Aufgaben == | == Aufgaben == | ||
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.