Vergleiche

Aus Xinux Wiki
Zur Navigation springen Zur Suche springen

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.