Test: Unterschied zwischen den Versionen

Aus Foxwiki
Keine Bearbeitungszusammenfassung
K (Textersetzung - „Bash:“ durch „Bash/“)
 
(34 dazwischenliegende Versionen von 4 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
Der Befehl ''test'' überprüft Dateien und vergleicht Werte.
{{DISPLAYTITLE:test}}
 
'''test''' prüft Dateien und vergleicht Werte
 
= Beschreibung =
= Installation =
= Syntax =
== Parameter ==
== Optionen ==
= Konfiguration =
= Anwendung =
 
 
Vor allem bei Skripten verwendet, um zu testen, ob eine Datei vorhanden ist und ob sie den richtigen Typ hat.


==Syntax==
==Syntax==
Zeile 9: Zeile 22:
*Ein ''test !'' ohne Parameter oder Ausdrücke liefert immer den Wert WAHR.
*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.
*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 $?
  $ test ; echo Der Errorlevel ist $?
Zeile 30: Zeile 44:
|ZEICHENKETTE1 != ZEICHENKETTE2 || Die Zeichenketten sind nicht identisch ||test Haha != Haha || 1
|ZEICHENKETTE1 != ZEICHENKETTE2 || Die Zeichenketten sind nicht identisch ||test Haha != Haha || 1
|}
|}
{|class="wikitable"
|+ 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.
{|class="wikitable"
|+ 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
|}
==Quelle==
* Manpage von test
= 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
= Links =
== Dateien ==
== Man-Pages ==
== Intern ==
== Weblinks ==
=Kontrollfragen=
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 1''
<div class="mw-collapsible-content">'''Antwort1'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 2''
<div class="mw-collapsible-content">'''Antwort2'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 3''
<div class="mw-collapsible-content">'''Antwort3'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 4''
<div class="mw-collapsible-content">'''Antwort4'''</div>
</div>
<div class="toccolours mw-collapsible mw-collapsed">
''Testfrage 5''
<div class="mw-collapsible-content">'''Antwort5'''</div>
</div>
[[Kategorie:Bash/Builtin]]
[[Kategorie:Bash/Scripting]]
[[Kategorie:Linux/Befehl]]
{{DEFAULTSORT:test}}

Aktuelle Version vom 27. März 2023, 11:21 Uhr


test prüft Dateien und vergleicht Werte

Beschreibung

Installation

Syntax

Parameter

Optionen

Konfiguration

Anwendung

Vor allem bei Skripten verwendet, um zu testen, ob eine Datei vorhanden ist und ob sie den richtigen Typ hat.

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

Quelle

  • Manpage von test

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):

-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

Links

Dateien

Man-Pages

Intern

Weblinks

Kontrollfragen

Testfrage 1

Antwort1

Testfrage 2

Antwort2

Testfrage 3

Antwort3

Testfrage 4

Antwort4

Testfrage 5

Antwort5