|
|
Zeile 123: |
Zeile 123: |
|
| |
|
| </noinclude> | | </noinclude> |
|
| |
| = test =
| |
| $ '''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):
| |
|
| |
| {|class="wikitable sortable" class="wikitable sortable"
| |
| |-
| |
| | | '''-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
| |
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.
Installation
Syntax
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
Zeichenkette
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
|
Zahlen
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.
Dateien
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
|
Parameter
Umgebungsvariablen
Exit-Status
Anwendung
Problembehebung
Konfiguration
Dateien
Anhang
Siehe auch
Dokumentation
Links
Projekt
Weblinks