test(1) test(1)
NAME
test, [ - Bedingungen prüfen
SYNTAX
test ausdruck
[ ausdruck ]
[[ ausdruck ]]
BESCHREIBUNG
Das Kommando test bzw. das in die Shell eingebaute Kommando [ 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.
Als Ergebnis liefert test zurück:
- Endestatus 0 (wahr), falls die Bedingung erfüllt ist.
- Endestatus 1 (falsch), falls die Bedingung nicht erfüllt ist oder
falls Sie die Bedingung nicht vollständig angegeben haben. Den
gleichen Endestatus erhalten Sie, wenn Sie keine Bedingung angeben.
Abhängig vom Endestatus können Sie unterschiedliche Kommandos ausfüh-
ren, Schleifen abbrechen usw.
Neben dem Kommando /usr/bin/test gibt es auch das in die Shell einge-
baute Kommandos test.
- Für das in die Bourne-Shell sh eingebaute Kommando test gibt es
folgende alternative Schreibweise. Die Wirkung ist dieselbe.
[ ausdruck ]
Die eckigen Klammern müssen Sie angeben, ebenso das Leerzeichen vor
bzw. nach ausdruck. Auch in diesem Fall führt die Shell das einge-
baute sh-Kommando test aus.
- Für das in die Korn-Shell ksh eingebaute Kommando test gibt es fol-
gende alternative Schreibweisen. Die Wirkung ist dieselbe.
[ ausdruck ] oder [[ ausdruck ]]
Seite 1 Reliant UNIX 5.44 Gedruckt 11/98
test(1) test(1)
Die eckigen Klammern müssen Sie angeben, ebenso das Leerzeichen vor
bzw. nach ausdruck. Für ausdruck haben Sie in der Korn-Shell
zusätzliche Möglichkeiten (siehe ksh(1), BEDINGTE AUSDRÜCKE).
ARGUMENTE
ausdruck
eine Bedingung oder mehrere Bedingungen, die miteinander ver-
knüpft sein können (siehe Bedingungen verknüpfen).
Folgende Bedingungen prüft test:
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 Verzeichnis
ist.
-h datei
wahr, wenn datei existiert und ein symbolischer Verweis ist. Nor-
malerweise verfolgen alle anderen Bedingungen symbolische Ver-
weise.
-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 block-
orientierte 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.
Seite 2 Reliant UNIX 5.44 Gedruckt 11/98
test(1) test(1)
-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 einem Ter-
minal zugeordnet ist.
dateikennzahl
für dateikennzahl können Sie angeben:
0 für Standardeingabe
1 für Standardausgabe
2 für Standardfehlerausgabe
datei
Name der Datei oder des Verzeichnisses, 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 Verzeichnisses 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 garan-
tieren also, daß test beim Ersetzen eines Shell-Parameters immer
ein Argument erhält.
Seite 3 Reliant UNIX 5.44 Gedruckt 11/98
test(1) test(1)
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 vorangestell-
ten 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 ange-
ben, 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 entspre-
chende Shell-Variable nicht definiert ist, erhält test als Argument
die leere Zeichenkette. Die Anführungszeichen garantieren also, daß
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 zugewie-
sen 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 Zei-
chenkette 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 muß jeweils ein Leerzeichen stehen, da
test dieses Zeichen als eigenständiges Argument erwartet. Wenn
Sie Shell-Parameter vergleichen, sollten Sie diese in Anführungs-
zeichen einschließen.
Seite 4 Reliant UNIX 5.44 Gedruckt 11/98
test(1) test(1)
zeichenkette1 != zeichenkette2
Wahr, wenn die beiden Zeichenketten verschieden sind. Vor und
nach dem Ungleichheitszeichen muß jeweils ein Leerzeichen stehen,
da test dieses Zeichen als eigenständiges Argument erwartet. Wenn
Sie Shell-Parameter vergleichen, schließen Sie diese in Anfüh-
rungszeichen ein.
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 zuwei-
sen.
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, daß test beim
Ersetzen eines Shell-Parameters immer ein Argument erhält.
zahl1 op zahl2
test vergleicht die beiden ganzen Zahlen zahl1 und zahl2 alge-
braisch entsprechend der Angabe für op.
Die Vergleichsoperatoren erwartet test als eigenständige Argu-
mente. 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.
Seite 5 Reliant UNIX 5.44 Gedruckt 11/98
test(1) test(1)
Bedingungen verneinen
! bedingung
Wahr, wenn die angegebene Bedingung nicht erfüllt ist. Nach dem
Ausrufezeichen muß ein Leerzeichen stehen.
Beispiel:
$ ! -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üp-
fen. Die Bedingung selbst kann auch verneint sein.
Die entsprechenden Verknüpfungsoperatoren erwartet test als eigenstän-
dige Argumente. Deshalb müssen sie zwischen zwei Leerzeichen stehen.
Das Kommando find durchsucht Verzeichnisse nach Dateien, die vorgege-
bene 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 muß
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 muß 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, daß eine vor der Klammer angegebene Ver-
knü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 muß
jeweils ein Leerzeichen stehen.
Seite 6 Reliant UNIX 5.44 Gedruckt 11/98
test(1) test(1)
Beispiel:
$ ! \( -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 Ausrufezei-
chen verneint den Klammerinhalt. Deshalb liefert test als Ende-
status 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 ausgewer-
tet und anschließend verneint.
ENDESTATUS
0 Der angegebene Ausdruck ist wahr.
1 Der angegebene Ausdruck ist falsch oder Sie haben eine Bedingung
nicht vollständig angegeben oder Sie haben überhaupt keine Bedin-
gung angegeben.
>1 Fehler.
FEHLERMELDUNG
test: argument expected
Diese Fehlermeldung erhalten Sie, wenn Sie eine Bedingung unvollstän-
dig 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.
Seite 7 Reliant UNIX 5.44 Gedruckt 11/98
test(1) test(1)
BEISPIELE
Beispiel 1:
Die folgende Shell-Prozedur prüft, ob der angegebene Stellungsparame-
ter der Name einer Datei oder eines Verzeichnisses 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 Verzeichnis
fi
Der Stellungsparameter $1 ist in Anführungszeichen eingeschlossen.
Deshalb setzt test dafür das aktuelle Verzeichnis ein, falls Sie beim
Aufruf der Shell-Prozedur kein weiteres Argument angeben.
Ohne Anführungszeichen würde test in diesem Fall mit einer Fehlermel-
dung 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
Seite 8 Reliant UNIX 5.44 Gedruckt 11/98
test(1) test(1)
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.
HINWEISE
test existiert sowohl als externes Kommando (/usr/bin/test) als auch
als eingebautes Shell-Kommando (Built-in), und zwar sowohl der Korn-
Shell ksh(1) wie auch der Bourne-Shell sh(1). Für die Ausführung von
/usr/bin/test erzeugt die Shell einen neuen Prozeß.
Bei der Verwendung von test können sich Abweichungen im Verhalten
ergeben, je nachdem, welche Shell benutzt wird. Die möglichen Abwei-
chungen sind nicht eigens beschrieben.
SIEHE AUCH
find(1), ksh(1), sh(1).
Seite 9 Reliant UNIX 5.44 Gedruckt 11/98