Vergleiche: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
Die Seite wurde neu angelegt: „= Vergleiche = == Grundprinzip == *Vergleiche werden in der Shell verwendet, um Bedingungen zu prüfen und Entscheidungen zu treffen.* *Das Ergebnis eines…“ |
|||
| (14 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 == | ||
*In der Bash können Befehle mit den Operatoren '''&&''' (UND) und '''||''' (ODER) logisch verknüpft werden. | *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. | *Diese Operatoren prüfen den Exit-Status des vorherigen Befehls und entscheiden, ob der nächste ausgeführt wird. | ||
{| border=1 cellpadding="3" | {| border=1 cellpadding="3" | ||
| 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 34: | Zeile 33: | ||
Hallo Thomas | Hallo Thomas | ||
* [ -z "$NAME" ] && echo "leer" || echo "nicht leer" | * [ -z "$NAME" ] && echo "leer" || echo "nicht leer" | ||
nicht leer | nicht leer | ||
== Das klassische test-Kommando == | == Das klassische test-Kommando == | ||
*Das Kommando '''test''' prüft Bedingungen und liefert einen passenden Exit-Status zurück. | *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'''. | *Die Schreibweise mit einfachen eckigen Klammern '''[ ... ]''' ist nur eine Kurzform von '''test'''. | ||
*Beide Varianten sind gleichwertig. | *Beide Varianten sind gleichwertig. | ||
;Beispiele | ;Beispiele | ||
| Zeile 46: | Zeile 45: | ||
* [ 5 -eq 5 ] | * [ 5 -eq 5 ] | ||
* echo $? | * echo $? | ||
0 | 0 | ||
== Numerische Vergleiche == | == Numerische Vergleiche == | ||
| Zeile 118: | Zeile 117: | ||
* [ /etc/passwd -nt /etc/group ] && echo "passwd ist neuer" | * [ /etc/passwd -nt /etc/group ] && echo "passwd ist neuer" | ||
== Erweiterte Syntax mit [[ ... ]] == | == 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 [ ... ] | ||
{| border=1 cellpadding="3" | {| border=1 cellpadding="3" | ||
! Merkmal !! [ ... ] !! [[ ... ]] | ! Merkmal !! [ ... ] !! <nowiki>[[ ... ]]</nowiki> | ||
|- | |- | ||
| Herkunft || POSIX-Standard || Bash-spezifische Erweiterung | | Herkunft || POSIX-Standard || Bash-spezifische Erweiterung | ||
| 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 145: | Zeile 144: | ||
* [ "$NAME" = "Thomas" ] && echo "klassischer Test" | * [ "$NAME" = "Thomas" ] && echo "klassischer Test" | ||
klassischer Test | klassischer Test | ||
* [[ $NAME == Th* ]] && echo "beginnt mit Th" | * <nowiki>[[ $NAME == Th* ]]</nowiki> && echo "beginnt mit Th" | ||
beginnt mit Th | beginnt mit Th | ||
== 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“. | ||
*'''[[ ... ]]''' 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 == | ||
*Prüfen Sie mit '''test''', ob eine Datei existiert. | *Prüfen Sie mit '''test''', ob eine Datei existiert. | ||
*Prüfen Sie, ob eine Variable leer ist. | *Prüfen Sie, ob eine Variable leer ist. | ||
*Vergleichen Sie zwei Zahlen und geben Sie eine Meldung aus, wenn die erste größer 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. | *Schreiben Sie eine Befehlszeile, die „OK“ ausgibt, wenn '''/etc/passwd''' existiert und lesbar ist. | ||
*Wiederholen Sie diese Aufgabe mit der modernen Syntax '''[[ ... ]]'''. | *Wiederholen Sie diese Aufgabe mit der modernen Syntax '''[[ ... ]]'''. | ||
*Überprüfen Sie mit '''echo $?''', ob Ihr letzter Test erfolgreich war. | *Überprüfen Sie mit '''echo $?''', ob Ihr letzter Test erfolgreich war. | ||
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.