(evaluate expression)
Das in die POSIX-Shell sh eingebaute Kommando test prüft, ob Bedingungen erfüllt sind. Bedingungen können sein:
Eigenschaften von Dateien,
Eigenschaften und Vergleiche von Zeichenketten und
algebraische Vergleiche ganzer Zahlen.
Sie können Bedingungen auch verneinen; mehrere Bedingungen können Sie miteinander verknüpfen.
Abhängig vom Endestatus können Sie unterschiedliche Kommandos ausführen, Schleifen abbrechen usw.
Für das eingebaute sh-Kommando test gibt es zwei Schreibweisen (siehe Syntax). Die Wirkung ist dieselbe.
Syntax
test ausdruck |
[ ausdruck ] |
Die eckigen Klammern müssen Sie angeben, ebenso das Leerzeichen
eine Bedingung oder mehrere Bedingungen, die miteinander verknüpft sein können (siehe Abschnitt „Bedingungen verknüpfen“). |
test prüft die folgenden Bedingungen: Eigenschaften von Dateien
(r - read) wahr, wenn datei existiert und Sie Leserecht haben.
(w - write) wahr, wenn datei existiert und Sie Schreibrecht haben.
(x - execute) wahr, wenn datei existiert und Sie Ausführrecht haben.
(f - file) wahr, wenn datei existiert und eine einfache Datei ist.
(d - directory) wahr, wenn datei existiert und ein Dateiverzeichnis ist.
wahr, wenn datei existiert.
wahr, wenn datei existiert und ein symbolischer Verweis ist. Normalerweise verfolgen alle anderen Bedingungen symbolische Verweise.
(c - character device) wahr, wenn datei existiert und eine zeichenorientierte Gerätedatei ist.
(b - block device) wahr, wenn datei existiert und eine blockorientierte Gerätedatei ist.
(p - pipe) wahr, wenn datei existiert und eine benannte Pipe (FIFO) ist.
(u - set user ID) wahr, wenn datei existiert und für den Eigentümer das s-Bit gesetzt ist.
(g - set group ID) wahr, wenn datei existiert und für die Gruppe das s-Bit gesetzt ist.
(k - sticky bit) wahr, wenn datei existiert und das Sticky-Bit gesetzt ist.
(s - size) wahr, wenn datei existiert und nicht leer ist.
(t - terminal) wahr, wenn die angegebene dateikennzahl geöffnet und einer Datensichtstation zugeordnet ist. dateikennzahl nicht angegeben:
Name der Datei oder des Dateiverzeichnisses, deren Eigenschaften geprüft werden sollen. Sie können auch relative oder absolute Pfadnamen angeben. Wenn Sie im Dateinamen Sonderzeichen der Shell verwenden, prüft test nur die erste zu diesem Namen passende Datei. Wenn Sie für datei die leere Zeichenkette angeben, also nur zwei Anführungszeichen "" oder zwei Hochkommas ’’, setzt test den Namen Ihres aktuellen Dateiverzeichnisses ein. Wenn Sie datei nicht angeben, gibt test eine Fehlermeldung aus und bricht mit Endestatus 1 ab. Sie können für datei auch einen Shell-Parameter angeben. Diesen sollten Sie immer in Anführungszeichen "..." einschließen. Wenn die entsprechende Shell-Variable nicht definiert ist, erhält test als Argument die leere Zeichenkette. Die Anführungszeichen garantieren also, dass test beim Ersetzen eines Shell-Parameters immer ein Argument erhält. |
Eigenschaften und Vergleiche von ZeichenkettenAls Zeichenkette können Sie eine beliebige Folge von Zeichen angeben. Enthält die Zeichenkette Leer- oder Tabulatorzeichen, müssen Sie diese entwerten. Wenn die Shell die Zeichenkette nicht interpretieren soll, entwerten Sie die entsprechenden Sonderzeichen mit einem vorangestellten Gegenschrägstrich \ oder schließen die ganze Zeichenkette in Anführungszeichen oder Hochkommas ein. Die leere Zeichenkette geben Sie an durch zwei aufeinanderfolgende Anführungszeichen oder Hochkommas. Wenn Sie keine Zeichenkette angeben, gibt test eine Fehlermeldung aus und bricht mit Endestatus 1 ab. Sie können als Zeichenkette auch einen Shell-Parameter angeben. Diesen sollten Sie immer in Anführungszeichen einschließen. Wenn die entsprechende Shell-Variable nicht definiert ist, erhält test als Argument die leere Zeichenkette. Die Anführungszeichen garantieren also, dass test beim Ersetzen eines Shell-Parameters immer ein Argument erhält.
(n - non zero) wahr, wenn die angegebene zeichenkette nicht die leere Zeichenkette ist, also eine Länge größer 0 hat. -n nicht angegeben:
(z - zero) wahr, wenn die angegebene zeichenkette die leere Zeichenkette ist, also die Länge 0 hat.
wahr, wenn die beiden Zeichenketten identisch sind. Vor und nach dem Gleichheitszeichen muss jeweils ein Leerzeichen stehen, da test dieses Zeichen als eigenständiges Argument erwartet. Wenn Sie Shell-Parameter vergleichen, sollten Sie diese in Anführungszeichen einschließen.
wahr, wenn die beiden Zeichenketten verschieden sind. Vor und nach dem Ungleichheitszeichen muss jeweils ein Leerzeichen stehen, da test dieses Zeichen als eigenständiges Argument erwartet. Wenn Sie Shell-Parameter vergleichen, schließen Sie diese in Anführungszeichen ein.
wahr, wenn Wenn
wahr, wenn zeichenkette nicht die leere Zeichenkette ist. |
Algebraische Vergleiche ganzer ZahlenGanze Zahlen können Sie direkt oder als Werte von Shell-Variablen angeben. Die angegebenen Zahlenwerte können beliebig groß sein. Einer Shell-Variablen können Sie ebenfalls beliebig große Zahlenwerte zuweisen.
test vergleicht die beiden ganzen Zahlen zahl1 und zahl2 algebraisch entsprechend der Angabe für op. op kann sein:
(eq - equal) wahr, wenn die beiden Zahlen gleich sind.
(ne - not equal) wahr, wenn die beiden Zahlen ungleich sind.
(ge - greater than or equal) wahr, wenn zahl1 größer oder gleich zahl2 ist.
(gt - greater than) wahr, wenn zahl1 größer ist als zahl2.
(le - less than or equal) wahr, wenn zahl1 kleiner oder gleich zahl2 ist.
(lt - less than) wahr, wenn zahl1 kleiner ist als zahl2. |
Bedingungen verneinen
wahr, wenn die angegebene Bedingung nicht erfüllt ist. Nach dem Ausrufezeichen muss ein Leerzeichen stehen. Beispiel
Wenn Sie die angegebene Datei nicht lesen dürfen, liefert test als Endestatus den Wert 0 (wahr) zurück. |
Bedingungen verknüpfenMehrere Bedingungen können Sie miteinander zu einem ausdruck verknüpfen. Die Bedingung selbst kann auch verneint sein. Das Kommando find durchsucht Dateiverzeichnisse nach Dateien, die vorgegebene Bedingungen erfüllen. Diese Bedingungen werden ähnlich verknüpft wie bei test. Bedingungen können Sie wie folgt miteinander verknüpfen:
(a - and) wahr, wenn jede der so aneinandergereihten Bedingungen erfüllt ist, also logisches UND. Vor und nach dem Operator -a muss jeweils ein Leerzeichen stehen.
(o - or) wahr, wenn mindestens eine der Bedingungen erfüllt ist, also logisches ODER. Vor und nach dem Operator -o muss jeweils ein Leerzeichen stehen.
ausdruck steht hier für zwei oder mehr Bedingungen, die beliebig miteinander verknüpft sind. Die runden Klammern fassen diese Bedingungen so zusammen, dass eine vor der Klammer angegebene Verknüpfung sich auf den Klammer-Inhalt und nicht nur auf die direkt nachfolgende Bedingung bezieht. Beispiel
Der Ausdruck in den runden Klammern ist wahr, wenn Sie für die angegebene Datei Lese- oder Schreibrecht haben. Das Ausrufezeichen verneint den Klammerinhalt. Deshalb liefert test als Endestatus den Wert 0 (wahr) zurück, wenn Sie für die angegebene Datei weder Lese- noch Schreibrecht haben. |
Priorität der VerknüpfungenDie Verknüpfungen haben für test folgende Priorität: Im vorigen Beispiel wird also zuerst der Inhalt der Klammern ausgewertet und anschließend verneint. |
Endestatus
0 | Der angegebene Ausdruck ist wahr. |
1 | Der angegebene Ausdruck ist syntaktisch richtig, aber die Auswertung des Ausdrucks liefert den Wert falsch oder Sie haben keinen Ausdruck angegeben. |
>1 | Fehler (z.B. syntaktisch falscher Ausdruck). |
Fehler
Diese Fehlermeldung erhalten Sie, wenn Sie eine Bedingung unvollständig angegeben haben, wenn also eine Datei bzw. eine Zeichenkette bzw. eine Zahl in der Angabe fehlen. Schließen Sie deshalb die Shell-Parameter immer in Anführungszeichen ein. Andernfalls fehlt ein Argument, wenn die entsprechende Shell-Variable nicht definiert ist. |
Internationale Umgebung
Die folgenden Umgebungsvariablen beeinflussen die Ausführung des Kommandos test: LANG Gibt einen Standardwert für die Variablen für die internationale Umgebung an, die nicht gesetzt oder Null sind. Ist LANG nicht gesetzt oder Null, wird der entsprechende Standardwert der internationalen Umgebung verwendet. Enthält eine der Internationalisierungsvariablen eine ungültige Einstellung, verhält sich das Kommando so, als sei keine der Variablen definiert worden. LC_ALL Ist diese Variable auf einen Wert gesetzt, d. h. ist sie nicht leer, überschreibt dieser Wert die Werte aller übrigen Internationalisierungsvariablen. LC_CTYPE Legt die internationale Umgebung für die Interpretation der Byte-Folgen eines Datentexts als Zeichen fest (z.B. Singlebytezeichen im Unterschied zu Mehrbytezeichen in Argumenten und Eingabedateien) sowie die Einteilung der Zeichen in Groß- und Kleinbuchstaben und deren Übereinstimmung. LC_MESSAGES Legt die internationale Umgebung für Format und Inhalt der Diagnosemeldungen fest, die in die Standardfehlerausgabe geschrieben werden. NLSPATH Legt den Pfad der Meldungsdateien für LC_MESSAGES fest. |
Beispiel 1
Die folgende Shell-Prozedur prüft, ob der angegebene Stellungsparameter der Name einer Datei oder eines Dateiverzeichnisses ist. if test -f "$1" # oder: if [ -f "$1" ] then echo $1 ist eine Datei elif test -d "$1" # oder: elif [ -d "$1" ] then echo $1 ist ein Dateiverzeichnis fi Der Stellungsparameter $1 ist in Anführungszeichen eingeschlossen. Deshalb setzt test dafür das aktuelle Dateiverzeichnis ein, falls Sie beim Aufruf der Shell-Prozedur kein weiteres Argument angeben. |
Beispiel 2
Die folgende Prozedur prüft mit dem Operator -gt, ob die beim Aufruf zuerst angegebene Datei, also $1, mehr Zeilen enthält als die danach angegebene Datei, also $2: if [ `wc -l "$1"` -gt `wc -l "$2"` ] then echo $1 enthaelt mehr Zeilen als $2 fi Das Kommando wc -l zählt die Zeilen der beiden Dateien und gibt die jeweiligen Zeilenzahlen aus. Die Shell ersetzt die Angabe in den Gegenhochkommas durch entsprechende Zeilenzahl. |
Beispiel 3
Es soll festgestellt werden, ob der Shell-Variablen TAPE ein Wert zugewiesen ist. Dazu gibt es mehrere Möglichkeiten: Möglichkeit A if [ ! -z "$TAPE" ] then echo Der Variablen TAPE ist ein Wert zugewiesen else .... fi Möglichkeit B if [ -n "$TAPE" ] then echo Der Variablen TAPE ist ein Wert zugewiesen else .... fi Die Angabe -n kann auch entfallen. Der Shell-Parameter $TAPE steht in Anführungszeichen, damit test keine Fehlermeldung ausgibt, falls der Variablen kein Wert zugewiesen ist. |
Siehe auch
find |