test
test - prüft Dateien und vergleicht Werte
Beschreibung
Vor allem bei Skripten verwendet, um zu testen, ob eine Datei vorhanden ist und ob sie den richtigen Typ hat.
Aufruf
test <Datei>
test <Wert1> OPTION <Wert2>
- Nur test ohne Parameter oder Ausdrücke liefert immer den Wert FALSCH.
- Ein test ! ohne Parameter oder Ausdrücke liefert immer den Wert WAHR.
- Um herauszufinden, welcher Wert herauskommt, muss man echo $? eingeben. 0 ist wahr, 1 ist falsch.
Vor und hinter dem Operator ein Leerzeichen, sonst wird es als ein Ausdruck wahrgenommen
test ; echo Der Errorlevel ist $?
Der Errorlevel ist 1
test ! ; echo Der Errorlevel ist $?
Der Errorlevel ist 0
Optionen
Option/Ausdruck | Beschreibung | Beispiel | Errorlevel |
---|---|---|---|
ZEICHENKETTE | Die Länge der ZEICHENKETTE ist nicht 0 | test Beispiel | 0 |
-z ZEICHENKETTE | Die Länge der Zeichenkette ist 0 | test -z Beispiel | 1 |
ZEICHENKETTE1 = ZEICHENKETTE2 | Die Zeichenketten sind identisch | test Haha = Haha | 0 |
ZEICHENKETTE1 != ZEICHENKETTE2 | Die Zeichenketten sind nicht identisch | test Haha != Haha | 1 |
Option/Ausdruck | Beschreibung | Beispiel | Errorlevel |
---|---|---|---|
ZAHL1 -eq ZAHL2 | ZAHL1 ist gleich ZAHL2 | test 5 -eq 5 | 0 |
ZAHL1 -ge ZAHL2 | ZAHL1 ist größer als oder gleich ZAHL2 | test 5 -ge 2 | 0 |
ZAHL1 -gt ZAHL2 | ZAHL1 ist größer als ZAHL2 | test 5 -gt 4 | 0 |
ZAHL1 -lt ZAHL2 | ZAHL1 ist kleiner als ZAHL2 | test 5 -lt 6 | 0 |
ZAHL1 -le ZAHL2 | ZAHL1 ist kleiner als oder gleich ZAHL2 | test 5 -le 7 | 0 |
ZAHL1 -ne ZAHL2 | ZAHL1 ist nicht gleich ZAHL2 | test 5 -ne 5 | 1 |
Achtung: test kann nur ganze Zahlen vergleichen.
Option/Ausdruck | Beschreibung |
---|---|
DATEI1 -ef DATEI2 | Die Dateien haben dieselben Geräte- und Inode-Nummern |
DATEI1 -nt/-ot DATEI2 | Die Datei ist bzgl. seines Änderungsdatums neuer/älter als die andere Datei |
-e | Die Datei existiert |
-f | Die Datei existiert und ist eine normale Datei |
-d | Die Datei existiert und ist ein Verzeichnis |
-b | Die Datei existiert und ist eine blockorientierte Gerätedatei |
-c | Die Datei existiert und ist eine charakterorientierte Gerätedatei |
-h | Die Datei existiert und ist ein Softlink |
-p | Die Datei existiert und ist eine "Named" Pipe |
-S | Die Datei existiert und ist ein Socket (Achtung! Großes S verwenden! Siehe kleines s) |
-r | Die Datei existiert und ist lesbar |
-w | Die Datei existiert und ist schreibbar |
-x | Die Datei existiert und ist ausführbar |
-s | Die Datei existiert und hat eine Dateigröße größer als 0 |
-u | Die Datei existiert und hat das "Set-UID"-Bit gesetzt |
-g | Die Datei existiert und hat das "Set-GID"-Bit gesetzt |
-k | Die Datei existiert und hat das "Sticky"-Bit gesetzt |
Argumente
Umgebungsvariablen
Exit-Status
Anwendung
$ test Ausdruck
test liefert in Abhängigkeit vom Wahrheitswert des Ausdrucks 0 (wahr) oder 1 (falsch) zurück und ist damit ein wichtiger Bestandteil vieler Shellskripten.
Es existieren mannigfaltige Klassen von Tests. Doch bevor wir Ihnen eine Auswahl verfügbarer Tests vorstellen, möchten wir auf eine alternative Schreibweise hinweisen, die gern bei bedingter Ausführung eingesetzt wird.
Im nachfolgenden Beispiel sind die beiden Zeilen semantisch äquivalent:
test -z $DISPLAY [ -z $DISPLAY ]
Beachten Sie, dass nach der öffnenden eckigen Klammer und vor der schließenden zwingend ein Whitespace stehen muss!
Die wohl wichtigsten Tests befassen sich mit Dateien(alle Tests schließen einen Existenztest der Datei mit ein):
-b/-c | Test auf Gerätedatei (Block/Character): | test -b - /dev/hda; echo $?
0 test -b /dev/console; echo $? 1 |
-d | Test auf Verzeichnis: | for i in $(ls|head -5); do
>(test -d $i && echo "$i ist ein Verzeichnis") >|| echo "$i ist kein Verzeichnis" > done Desktop ist ein Verzeichnis Linuxfibel ist ein Verzeichnis Systemprogrammierung ist ein Verzeichnis allekapitel.htm ist kein Verzeichnis amanda.rpm ist kein Verzeichnis |
-e | Existenz der Datei | |
-f | Test auf normale Datei: | test -f /dev/hda; echo $?
1 |
-k | Test, ob das sticky-Flag auf ein Verzeichnis gesetzt ist: | test -k /tmp; echo $?
0 |
-p | Test auf Pipe: | test -p /dev/xconsole; echo $?
0 |
-r/-w/-x | Test auf Lese-/Schreib-/Ausführungsrecht | |
-s | Test, ob eine Datei nicht leer ist | |
-u | Test, ob das suid-Flag auf einer Datei gesetzt ist: | test -u /usr/bin/passwd; echo $?
0 |
Datei_1 -nt Datei_2 bzw. Datei_1 -ot Datei_2
Test, ob Datei_1 neuer bzw. älter ist als die Datei_2
Datei_1 -ef Datei_2
Test, ob Datei_1 und Datei_2 den selben Inode auf demselben Device besitzen (die eine Datei ist ein harter Link auf die andere):
ln bla foo test bla -ef foo; echo $? 0
Des Weiteren existieren eine Reihe von Operatoren zum Vergleich von Zeichenketten:
-z Zeichenkette
Der Test ist wahr, wenn die Zeichenkette die Länge 0 hat
-n string
Der Test ist wahr, wenn die Länge der Zeichenkette >0 ist
Zeichenkette_1 == Zeichenkette_2
Wahr, wenn die Zeichenketten gleich sind
Zeichenkette_1 != Zeichenkette_2
Wahr, wenn die Zeichenketten ungleich sind
Zeichenkette_1 < Zeichenkette_2
Wahr, wenn die Zeichenkette_1 lexikalisch kleiner ist als Zeichenkette_2
Zeichenkette_1 > Zeichenkette_2
Wahr, wenn die Zeichenkette_1 lexikalisch größer ist als Zeichenkette_2
Eine vielseitige Anwendung ist der Vergleich von Argumenten mit den Operatoren -eq (gleich), -ne (ungleich), -gt (größer als), -lt (kleiner als), -ge (größer als oder gleich) und -le (kleiner als oder gleich):
# Überprüfung der Anzahl Parameter in einem Shellskript... if [ "$#" -lt "3" ]; then echo "Zu wenige Parameter"; exit 1; fi
Anmerkung Die Prüfung und Beendigung eines Skripts im Fehlerfall lässt sich eleganter über die Parametersubstitution realisieren:
# Elegante Überprüfung der Anzahl Parameter in einem Shellskript... var_3 = ${3:?Zu wenige Parameter}
Mehrere Tests können kombiniert werden:
! Negation -a Logisches UND zweier Tests -o Logisches ODER zweier Tests test -b /dev/null -o -c /dev/null test $? -eq 0 && echo "Gerätedatei" Gerätedatei
Installation
Anhang
Siehe auch
Dokumentation
- Manpage von test
Links
Projekt
Weblinks
TMP
Bedingungen testen
Das wichtigste Kommando ist 'test', mit dem man mannigfache Bedingungen testen kann
test Argument
Dieses Kommando prüft eine Bedingung und liefert 'true' (0), falls die Bedingung erfüllt ist und 'false' (1), falls die Bedingung nicht erfüllt ist. Der Fehlerwert 2 wird zurückgegeben, wenn das Argument syntaktisch falsch ist (meist durch Ersetzung hervorgerufen)
Es lassen sich Dateien, Zeichenketten und Integer-Zahlen (16 Bit, bei Linux 32 Bit) überprüfen. Das Argument von Test besteht aus einer Testoption und einem Operanden, der ein Dateiname oder eine Shell-Variable (Inhalt: String oder Zahl) sein kann
In bestimmten Fällen können auf der rechten Seite eines Vergleichs auch Strings oder Zahlen stehen - bei der Ersetzung von leeren Variablen kann es aber zu Syntaxfehlern kommen. Weiterhin lassen sich mehrere Argumente logisch verknüpfen (UND, ODER, NICHT). Beispiel
test -w /etc/passwd
mit der Kommandoverkettung lassen sich so schon logische Entscheidungen treffen, beispielsweise
test -w /etc/passwd && echo "Du bist ROOT"
Normalerweise kann statt 'test' das Argument auch in eckigen Klammern gesetzt werden. Die Klammern müssen von Leerzeichen umschlossen werden
[ -w /etc/passwd ]
- Operationen
Dateitests | |
-b Datei | Die Datei existiert und ist ein blockorientiertes Gerät |
-c Datei | Die Datei existiert und ist ein zeichenorientiertes Gerät |
-d Datei | Die Datei existiert und ist ein Verzeichnis |
-e Datei | Datei existiert |
-f Datei | Die Datei existiert und ist eine reguläre Datei |
-g Datei | Die Datei existiert und das Gruppen-ID-Bit ist gesetzt |
-h Datei | Die Datei existiert und ist ein symbolischer Link |
-k Datei | Die Datei existiert und das Sticky-Bit ist gesetzt |
-p Datei | Die Datei existiert und ist eine Named Pipe |
-r Datei | Die Datei existiert und ist lesbar |
-s Datei | Die Datei existiert und ist nicht leer |
-t [n] | DATEI-Descriptor FD (Standard: Standardausgabe) ist auf Tty offen |
-u Datei | Die Datei existiert und das Setuid-Bit ist gesetzt |
-w Datei | Die Datei existiert und ist beschreibbar |
-x Datei | Die Datei existiert und ist ausführbar |
Datei1 -nt Datei2 | Datei1 ist neuer als Datei2 |
Datei1 -ot Datei2 | Datei1 ist älter als Datei2 |
Datei1 -ef Datei2 | Beide Dateien belegen dieselbe Inode auf demselben Gerät |
- Beispiel
Wenn ein Verzeichnis RCS existiert
if [ -d RCS ] Wenn ein Verzeichnis RCS existiert
Bedingungen für Zeichenfolgen | |
-n s1 | Die Länge der Zeichenfolge s1 ist ungleich Null |
-z s1 | Die Länge der Zeichenfolge s1 ist gleich Null |
s1 = s2 | Die Zeichenfolgen s1 und s2 sind identisch |
s1 != s2 | Die Zeichenfolgen s1 und s2 sind nicht identisch |
Zeichenfolge | Die Zeichenfolge ist nicht Null |
- Beispiel
Wenn dieAntwort nicht "j" ist
if [ "$Antwort" != "j" ]
Ganzzahlvergleiche: | |
n1 -eq n2 | n1 ist gleich n2 |
n1 -ge n2 | n1 ist größer oder gleich n2 |
n1 -gt n2 | n1 ist größer als n2 |
n1 -le n2 | n1 ist kleiner oder gleich n2 |
n1 -lt n2 | n1 ist kleiner n2 |
n1 -ne n2 | n1 ist ungleich n2 |
- Beispiele
while test# -gt 0 Solange Argumente vorliegen
while [ -n "$1" ] Solange das erste Argument nicht leer ist
if [count -lt 10 ] Wenncount kleiner 10
Kombinierte Formen | |
(Bedingung) | Wahr, wenn die Bedingung zutrifft (wird für die Gruppierung verwendet). Den Klammern muss ein \ vorangestellt werden |
! Bedingung i | Wahr, wenn die Bedingung nicht zutrifft (NOT) |
Bedingung1 -a Bedingung2 | Wahr, wenn beide Bedingungen zutreffen (AND) |
Bedingung1 -o Bedingung2 | Wahr, wenn eine der beiden Bedingungen zutrifft (OR) |
- Beispiel
Wenn das erste Argument keine lesbare oder reguläre Datei ist
if [ ! -r "$1" -o ! -f "$1" ]