Your Browser is not longer supported

Please use Google Chrome, Mozilla Firefox or Microsoft Edge to view the page correctly
Loading...

{{viewport.spaceProperty.prod}}

test - Bedingungen prüfen

&pagelevel(4)&pagelevel

(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 ]

[ ausdruck ]

Die eckigen Klammern müssen Sie angeben, ebenso das Leerzeichen ' ' vor bzw. nach ausdruck. Auch in diesem Fall führt die Shell das eingebaute sh-Kommando test aus.

ausdruck

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 datei

(r - read)

wahr, wenn datei existiert und Sie Leserecht haben.

-w datei

(w - write)

wahr, wenn datei existiert und Sie Schreibrecht haben.

-x datei

(x - execute)

wahr, wenn datei existiert und Sie Ausführrecht haben.

-f datei

(f - file)

wahr, wenn datei existiert und eine einfache Datei ist.

-d datei

(d - directory)

wahr, wenn datei existiert und ein Dateiverzeichnis ist.

-e datei

wahr, wenn datei existiert.

-h datei

wahr, wenn datei existiert und ein symbolischer Verweis ist. Normalerweise verfolgen alle anderen Bedingungen symbolische Verweise.

-c datei

(c - character device)

wahr, wenn datei existiert und eine zeichenorientierte Gerätedatei ist.

-b datei

(b - block device)

wahr, wenn datei existiert und eine blockorientierte Gerätedatei ist.

-p datei

(p - pipe)

wahr, wenn datei existiert und eine benannte Pipe (FIFO) ist.

-u datei

(u - set user ID)

wahr, wenn datei existiert und für den Eigentümer das s-Bit gesetzt ist.

-g datei

(g - set group ID)

wahr, wenn datei existiert und für die Gruppe das s-Bit gesetzt ist.

-k datei

(k - sticky bit)

wahr, wenn datei existiert und das Sticky-Bit gesetzt ist.

-s datei

(s - size)

wahr, wenn datei existiert und nicht leer ist.

-t[ dateikennzahl]

(t - terminal)

wahr, wenn die angegebene dateikennzahl geöffnet und einer Datensichtstation zugeordnet ist.

dateikennzahl nicht angegeben:
Standardmäßig wird 1 als Dateikennzahl verwendet.

datei

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 Zeichenketten

Als 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 ]zeichenkette

(n - non zero) wahr, wenn die angegebene zeichenkette nicht die leere Zeichenkette ist, also eine Länge größer 0 hat.
So können Sie testen, ob einer Shell-Variablen ein Wert zugewiesen ist. Den entsprechenden Shell-Parameter schließen Sie in Anführungszeichen ein.

-n nicht angegeben:
Die Angabe ohne -n hat die gleiche Bedeutung. Mit -n ist die Bedingung leichter lesbar.

-z zeichenkette

(z - zero) wahr, wenn die angegebene zeichenkette die leere Zeichenkette ist, also die Länge 0 hat.
So können Sie feststellen, ob einer Shell-Variablen kein Wert zugewiesen ist. Den entsprechenden Shell-Parameter schließen Sie in Anführungszeichen ein.

zeichenkette1 = zeichenkette2

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.

zeichenkette1 != zeichenkette2

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.

zeichenkette1 =~ zeichenkette2

wahr, wenn zeichenkette1 dem erweiterten regulären Ausdruck zeichenkette2 entspricht. Die Überprüfung des erweiterten regulären Ausdrucks zeichenkette2 erfolgt mit der Funktion regcomp() und der Vergleich der Zeichenketten mit der Funktion regexec(), siehe Referenzhandbuch "C-Bibliotheksfunktionen für POSIX-Anwendungen [4]".

Wenn zeichenkette2 kein gültiger erweiterter regulärer Ausdruck ist, liefert test als Endestatus den Wert 2 zurück.

zeichenkette

wahr, wenn zeichenkette nicht die leere Zeichenkette ist.

Algebraische Vergleiche ganzer Zahlen

Ganze 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.
Wenn Sie als Zahl einen Shell-Parameter angeben, sollten Sie diesen 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.

zahl1 op zahl2

test vergleicht die beiden ganzen Zahlen zahl1 und zahl2 algebraisch entsprechend der Angabe für op.
Die Vergleichsoperatoren erwartet test als eigenständige Argumente. Deshalb müssen sie zwischen zwei Leerzeichen stehen.

op kann sein:

-eq

(eq - equal)

wahr, wenn die beiden Zahlen gleich sind.

-ne

(ne - not equal)

wahr, wenn die beiden Zahlen ungleich sind.

-ge

(ge - greater than or equal)

wahr, wenn zahl1 größer oder gleich zahl2 ist.

-gt

(gt - greater than)

wahr, wenn zahl1 größer ist als zahl2.

-le

(le - less than or equal)

wahr, wenn zahl1 kleiner oder gleich zahl2 ist.

-lt

(lt - less than)

wahr, wenn zahl1 kleiner ist als zahl2.


Bedingungen verneinen

! bedingung

wahr, wenn die angegebene Bedingung nicht erfüllt ist. Nach dem Ausrufezeichen muss ein Leerzeichen stehen.

Beispiel

$ test ! -r datei

Wenn Sie die angegebene Datei nicht lesen dürfen, liefert test als Endestatus den Wert 0 (wahr) zurück.

Bedingungen verknüpfen

Mehrere Bedingungen können Sie miteinander zu einem ausdruck verknüpfen. Die Bedingung selbst kann auch verneint sein.
Die entsprechenden Verknüpfungsoperatoren erwartet test als eigenständige Argumente. Deshalb müssen sie zwischen zwei Leerzeichen stehen.

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:

bedingung -a bedingung

(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.

bedingung -o bedingung

(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 \)

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.
Da die runden Klammern für die Shell eine Sonderbedeutung haben, müssen sie mit \ entwertet werden. Vor und nach ausdruck muss jeweils ein Leerzeichen stehen.

Beispiel

$ test ! \( -r datei -o -w datei \)

ODER

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üpfungen

Die Verknüpfungen haben für test folgende Priorität:
Klammern vor Verneinung vor UND vor ODER

Im vorigen Beispiel wird also zuerst der Inhalt der Klammern ausgewertet und anschließend verneint.

Endestatus

0Der angegebene Ausdruck ist wahr.
1Der angegebene Ausdruck ist syntaktisch richtig, aber die Auswertung des Ausdrucks liefert den Wert falsch oder Sie haben keinen Ausdruck angegeben.
>1Fehler (z.B. syntaktisch falscher Ausdruck).

Fehler

test: argument expected

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.
Ohne Anführungszeichen würde test in diesem Fall mit einer Fehlermeldung abbrechen.

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