|
Viele Kontrollstrukturen wie bedingte Anweisungen oder Schleifen benötigen Kriterien, nach denen ihr Ablauf gesteuert wird. Diese Kriterien stellen in der Regel Bedingungen dar. Je nach Art der Konstrollstruktur, müssen die Bedingungen jedoch erst noch formuliert werden.
Um diese Formulierung umzusetzen, wird der Befehl test eingesetzt. Dabei ist die Arbeitsweise realtiv simpel. Ergibt die Prüfung, dass eine Bedingung erfüllt, respektive wahr ist, dann liefert der Befehl test den Rückgabewert 0. Wenn nicht, also unwahr, die 1. Abhängig von dem Rückgabewert entscheiden Kontrollstrukturen wie bedingte Anweisungen oder Schleifen schließlich über ihre weiteren Aktionen.
Dafür stehen dem Befehl test verschiedenste Optionen zur Verfügung, mit denen sich flexible Formulierungen für die zu prüfenden Argumenten realisieren lassen. Im Wesentlichen bieten die Optionen:
- dateibezogene Bedingungen (d)
- algebraische Vergleiche (a)
- Stringvergleiche (s)
Die folgende Tabelle liefert eine Übersicht über oft angewandte Optionen. Die volltändigen Optionen kann man der Manpage entnehmen:
| Formulierung |
d |
a |
s |
Bedingung |
-e Argument |
x |
|
|
Argument existiert |
-r Argument |
x |
|
|
Argument hat Leserechte |
-w Argument |
x |
|
|
Argument hat Schreibrechte |
-x Argument |
x |
|
|
Argument hat Ausführungsrechte / Betretungsrechte |
-f Argument |
x |
|
|
Argument ist eine Datei |
-d Argument |
x |
|
|
Argument ist ein Verzeichnis |
-c Argument |
x |
|
|
Argument ist zeichenorientiert |
-b Argument |
x |
|
|
Argument ist blockorientiert |
-L Argument |
x |
|
|
Argument ist ein symbolischer Link |
Argument_1 -ne Argument_2 |
|
x |
|
Argument_1 ist ungleich dem Argument_2 |
Argument_1 -ge Argument_2 |
|
x |
|
Argument_1 ist größer oder gleich dem Argument_2 |
Argument_1 -gt Argument_2 |
|
x |
|
Argument_1 ist größer als das Argument_2 |
Argument_1 = Argument_2 |
|
|
x |
Argument_1 ist identisch mit dem Argument_2 |
Argument_1 != Argument_2 |
|
|
x |
Argument_1 ist nicht identisch mit dem Argument_2 |
-n Argument |
|
|
x |
Argument ist nicht leer |
-z Argument |
|
|
x |
Argument ist leer |
Die Rückgabewerte ( 0 oder 1 ) werden systemintern behandelt, so das es in der Eingabezeile weder zur Darstellung des Rückgabewerts noch zu einer sonstigen Meldung kommt. Mit dem Kommando echo $? lässt sich jedoch der Rückgabewert des letzten Kommandos und damit auch des test-Befehls manuell erfragen. Daher soll er auch in den folgenden Formulierungen zur Darstellung des Rückgabewerts genutzt werden:
Hier wurde das Argument /boot daraufhin überprüft, ob es existiert und eine Datei oder ein Verzeichnis ist. Da letzteres zutrifft, erhällt das System auch den Rückgabewert 0.
In diesem Fall wurde ein algebraischer Vergleich durchgeführt. Da aber das Argument 5 keineswegs größer ist als das Argument 6, führt das Ergebnis zum Rückgabewert 1.
myVar='Hallo Welt!' test -z "$myVar" echo $?
Zu Beginn wird eine Variable zur Prüfung mit dem String Hallo Welt! initialisiert. Die darauffolgende Prüfung, ob der String den diese Variable enthält leer ist, führt dann selbstverständlich zu dem Rückgabewert 1.
Diese soll zur Erläuterung genügen. Die Rückgabewerte bei anderen Optionen lassen sich nun leicht ableiten.
Der eine oder andere der sich mal ein Script angeschaut hat, wird sich nun vielleicht fragen, warum er dieses angeblich so wichtige Kommando test nie gesehen hat. Das hat einen ganz einfachen Grund. Aufgrund der häufigen Anwendung existiert für diesen Befehl eine alternative Syntax. Anstantt den Befehl test zu verwenden, wird die Formulierung einfach in eckige Klammern ( [ ] ) gefasst:
test 'Hallo Welt!' = 'Hallo Welt'
...lässt sich somit auch auf diese Weise formulieren...
[ 'Hallo Welt!' = 'Hallo Welt!' ]
Diese Schreibweise ist um einiges angenehmer, da zusätzlich die explizite Kommandosubstitution ( `Kommando` ), wie sie in bedingten Anweisungen oder Schleifen erforderlich wäre, entfallen kann. Für die korrekte Formulierung ist aber genaustens auf die vorhandenen Leerzeichen zu achten. Nach der öffnenden eckigen Klammer ( [ ), vor und nach dem Gleichheitszeichen ( = ) und vor der schließenden eckigen Klammer ( ] ).
Anmerkung: Diese Syntax ist keine allgemeingültige alternative Schreibweise für die Kommandosubstitution. Diese Schreibweise gilt nur für den test-Befehl.
Weitere Informationen:
- Eine zusätzliche alternative Schreibweise ist die Verwendung von doppelten runden Klammern
(( )), anstatt der eckigen bei algebraischen Vergleichen. Dann kann beispielsweise anstatt der Option -lt einfach das Kleiner-Zeichen < verwendet werden. Diese Schreibweise ist jedoch eher selten anzutreffen.
- Werden bei Stringvergleichen reguläre Audrücke verwendet (beispielsweise Wildcards wie
*, ?), dann muss man die Formulierung in doppelte eckige Klammern [[ ]] fassen.
|