bash: Formulierung von Bedingungen

Für die Formulierung von Bedingungen, wie sie für die Kontrollstrukturen benötigt werden, wird bei der bash ein integriertes (buildin) Kommando verwendet, das test-Kommando. Mit diesem können unterschiedliche Bedingungen definiert werden, wobei sowohl zeichenbasierte und nummerische Bedingungen als auch Bedingungen auf Dateien und Verzeichnisse möglich sind. Weiterhin können mehrere Bedingungen miteinander verknüpft werden.

Das test-Kommando liefert bei einer wahren Bedingung eine exit-Wert von 0, ansonsten einen von 0 unterschiedlichen Wert. Sollten keine Argumente an test übergeben werden, so liefert test immer einen Wert unterschiedlich von 0 (falsch). Für den Aufruf gibt es zwei Möglichkeiten:

oder

Wichtig ist bei der zweiten Form, dass nach der öffnenden eckigen Klamme [ und vor der schließenden eckigen Klamme ] mindestens ein Leer- oder Tabulatorzeichen angegeben wird. Sollen Zeichenketten mit Leerzeichen verglichen werden, müssen diese in Hochkommata gestellt werden, damit der komplette String verglichen wird. Gerade bei Variablen kann dies eine häufige Fehlerquelle sein.

Bedingungen für Zeichenketten und Zahlen

Für Bedingungen, die auf Zeichenketten wirken sollen, stehen die folgenden Bedingungen zur Verfügung:

Ausdruck liefert wahr, wenn
zk die Zeichenkette nicht leer ist
-z zk die Zeichenkette leer ist [0 Zeichen] (zero)
-n zk die Zeichenkette nicht leer ist (not zero)
zk1 = zk2 die Zeichenketten identisch sind
zk1 != zk2 die Zeichenketten voneinander abweichen

und für numerische Bedingungen:

Ausdruck liefert wahr, wenn
z1 -eq z2 die Zahlen gleich sind (equal)
z1 -ne z2 die Zahlen ungleich sind (not equal)
z1 -gt z2 z1 größer z2 ist (greater than)
z1 -ge z2 z1 größer gleich z2 ist (greater equal)
z1 -lt z2 z1 kleiner z2 ist (less than)
z1 -le z2 z1 kleiner gleich z2 ist (less equal)

Bedingungen auf Dateien

Weiterhin können mittels test Bedingungen auf Dateien formuliert werden, wobei die Argumente der Bedingung als Pfad zu einer Datei interpretiert werden:

Ausdruck liefert wahr, wenn
-b dat dat existiert und eine blockspezif. Gerätedatei ist (block)
-c dat dat existiert und eine zeichenspezif. Gerätedatei ist (character)
-d dat dat existiert und es sich um ein Verzeichnis handelt (directory)
-e dat die Datei existiert (exist)
-f dat dat existiert und es sich um eine einfache Datei handelt (file)
-L dat dat existiert und es sich um einen symbolische Link handelt (Link)
-r dat dat existiert und die Datei gelesen werden darf (read)
-s dat dat existiert und die Datei mindestens 1 Byte lang ist (size)
-w dat dat existiert und die Datei verändert werden darf (write)
-x dat dat existiert und die Datei ausgeführt werden darf (execute)
-O dat dat existiert und der dat-Eigentümer der effektiven UID entspricht (Owner)
-G dat dat existiert und die dat-Gruppe der effektiven GID entspricht (Group)
-S dat dat existiert und eine spezielle Datei vom socket-Typ ist (Socket)
-p dat dat existiert und eine named pipe ist (pipe)
dat1 -ef dat2 beide Dateien denselben I-Node haben (equal file)
dat1 -nt dat2 dat1 neuer als dat2 ist (newer than)
dat1 -ot dat2 dat1 älter als dat2 ist (older than)

Verknüpfung von Bedingungen

Für die Verknüpfung von Bedingungen stehen noch die folgenden Operatoren zur Verfügung:

Ausdruck Bedeutung
!ausdruck negiert den Wahrheitswert des nachfolgenden Ausdrucks
ausdr1 -a ausdr2 verknüpft die Wahrheitswerte der beiden Ausdrücke mit dem UND-Operator (and)
ausdr1 -o ausdr2 verknüpft die Wahrheitswerte der beiden Ausdrücke mit dem ODER-Operator (or)
( ausdr ) Klammerung eines Ausdruckes, um andere als die voreingestellten Prioritätenfür die Operatoren bei der Auswertung eines Ausdrucks festzulegen