Vergleiche: Unterschied zwischen den Versionen
Zur Navigation springen
Zur Suche springen
| Zeile 170: | Zeile 170: | ||
== 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. |
Version vom 24. November 2025, 17:35 Uhr
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
- 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). | \| 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.