test: Unterschied zwischen den Versionen

Aus Mikiwiki
Zur Navigation springen Zur Suche springen
 
(16 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 3: Zeile 3:
Um einen sicheren Befehlsablauf zu gewährleisten, müssen vorab die Voraussetzungen geprüft werden (Plausibilitätsprüfungen). test wird verwendet
Um einen sicheren Befehlsablauf zu gewährleisten, müssen vorab die Voraussetzungen geprüft werden (Plausibilitätsprüfungen). test wird verwendet
* um zu prüfen, ob eine Datei existiert, welchem Dateityp sie angehört und welche Zugriffsrechte gesetzt sind.
* um zu prüfen, ob eine Datei existiert, welchem Dateityp sie angehört und welche Zugriffsrechte gesetzt sind.
* um zu prüfen, ob bestimmte Zeichenfolgen [engl. strings] vorhanden sind.
* um zu prüfen, ob bestimmte Zeichenfolgen (engl. strings) vorhanden sind.
* um Zeichenfolgen miteinander zu vergleichen. Hierbei kann auf Textgleichheit abgefragt werden oder bei Zahlen können algebraische Vergleiche vorgenommen werden.
* um Zeichenfolgen miteinander zu vergleichen. Hierbei kann auf Textgleichheit abgefragt werden oder bei Zahlen können algebraische Vergleiche vorgenommen werden.


Zeile 13: Zeile 13:


{| class=wikitable width=100%
{| class=wikitable width=100%
! width=5% | Option !! Beschreibung !! Beispiel
! width=5% | Option !! width=50% | Beschreibung !! Beispiel
|-
|-
| <tt>=</tt> || Zeichenketten sind identisch. ||
| <tt>=</tt> || Zeichenfolgen sind identisch. ||


  [ "$string1" = "$string2" ]
  [ "${ZEICHENFOLGE_1}" = "${ZEICHENFOLGE_2}" ]


Variable $start ist "yes".
test ${ZEICHENFOLGE_1} = ${ZEICHENFOLGE_2}


[ "$start" = yes ]
Inhalt der Variable VARIABLE ist "ja".


[ "${VARIABLE}" = "ja" ]
|-
|-
| <tt>!=</tt> || Zeichenketten sind <i>nicht</i> identisch. ||
| <tt>!=</tt> || Zeichenfolgen sind <b>nicht</b> identisch. ||


  [ "$string1" != "$string2" ]
  [ "${ZEICHENFOLGE_1}" != "${ZEICHENFOLGE_2}" ]


test "${ZEICHENFOLGE_1}" != "${ZEICHENFOLGE_1}"
|-
|-
| <tt>-r</tt> || (read) Prüfen, ob die Datei existiert und Leseerlaubnis hat.
| <tt>-b</tt> || (block) Prüfen, ob die Datei vorhanden und ein blockorientiertes Gerät ist.
|-
|-
| <tt>! -r</tt> || (read) Prüfen, ob die Datei existiert und <i>keine</i> Leseerlaubnis hat.
| <tt>-c</tt> || (character) Prüfen, ob die Datei vorhanden und ein zeichenorientiertes Gerät ist.
|-
|-
| <tt>-w</tt> || (write) Prüfen, ob die Datei existiert und Schreiberlaubnis hat.
| <tt>-d</tt> || (directory) Prüfen, ob die Datei vorhanden und ein Verzeichnis ist.
|-
|-
| <tt>-x</tt> || (executable) Prüfen, ob die Datei existiert und ausführbar ist.
| <tt>-e</tt> || (file) Prüfen, ob die Datei vorhanden ist.
|-
|-
| <tt>-f</tt> || (file) Prüfen, ob die Datei existiert und es eine normale Datei ist (also kein Link o. ä.).
| <tt>-f</tt> || (file) Prüfen, ob die Datei vorhanden und eine normale Datei ist (also kein Link o. ä.).
|-
|-
| <tt>-b</tt> || (block) Prüfen, ob die Datei existiert und ein blockorientiertes Gerät ist.
| <tt>-n</tt> || (not zero) Prüfen, ob die Variable ZEICHENKETTE nicht leer ist. ||
 
[ "${ZEICHENKETTE}" ]
[ -n "${ZEICHENKETTE}" ]
|-
|-
| <tt>-c</tt> || (character) Prüfen, ob die Datei existiert und ein zeichenorientiertes Gerät ist.
| <tt>-r</tt> || (read) Prüfen, ob die Datei vorhanden ist und Leseerlaubnis hat.
|-
|-
| <tt>-d</tt> || (directory) Prüfen, ob die Datei existiert und ein Verzeichnis ist.
| <tt>! -r</tt> || (read) Prüfen, ob die Datei vorhanden ist und <b>keine</b> Leseerlaubnis hat.
|-
|-
| <tt>-s</tt> || (size) Prüfen, ob die Datei existiert und mehr als 0 byte enthält.
| <tt>-s</tt> || (size) Prüfen, ob die Datei vorhanden ist und mehr als 0 byte enthält.
|-
|-
| <tt>-n</tt> || (not zero) Prüfen, ob die Zeichenkette (z. B. eine Variable) nicht leer ist. ||
| <tt>-w</tt> || (write) Prüfen, ob die Datei vorhanden ist und Schreiberlaubnis hat.
 
|-
[ "$string" ]
| <tt>-x</tt> || (executable) Prüfen, ob die Datei vorhanden und ausführbar ist.
[ -n "$string" ]
 
|-
|-
| <tt>-z</tt> || (zero) Prüfen, ob die Zeichenkette leer ist. ||
| <tt>-z</tt> || (zero) Prüfen, ob die Zeichenkette leer ist. ||


  [ -z "$string" ]
  [ -z "${ZEICHENKETTE}" ]
 
|-
|-
| <tt>-a</tt> || (and) Prüfen ob beide kombinierten<tt> test</tt>-Abfragen erfolgreich sind (UND-Verknüpfung).<br>Wenn die Datei "$Datvon" Leseberechtigung hat UND nicht bereits eine normale Datei namens "$Datnach" existiert, soll "$Datvon" unter dem Namen "$Datnach" kopiert werden. ||
| <tt>-a</tt> || (and) Prüfen ob beide kombinierten <code>test</code>-Abfragen erfolgreich sind (UND-Verknüpfung). || Wenn die Datei "$Datvon" Leseberechtigung hat UND nicht bereits eine normale Datei namens "$Datnach" existiert, soll "$Datvon" unter dem Namen "$Datnach" kopiert werden.


  #!/bin/sh
  #!/bin/sh
Zeile 68: Zeile 70:
   then cp $Datvon $Datnach
   then cp $Datvon $Datnach
  fi
  fi
|-
|-
| <tt>-o</tt> || (or) Prüfen ob mindestens eine der kombinierten<tt> test</tt>-Abfragen erfolgreich ist (ODER-Verknüpfung).<br>Abfrage, ob die Antwort "ja" ODER "j" ist. Alle anderen Eingaben (z. B. "Ja" oder "JA") sind nicht erfolgreich. ||
| <tt>-o</tt> || (or) Prüfen ob mindestens eine der kombinierten<tt> test</tt>-Abfragen erfolgreich ist (ODER-Verknüpfung). || Abfrage, ob die Antwort "ja" ODER "j" ist. Alle anderen Eingaben (z. B. "Ja" oder "JA") sind nicht erfolgreich.


  #!/bin/sh
  #!/bin/sh
Zeile 78: Zeile 79:
   then rm $1
   then rm $1
  fi
  fi
|-
|-
| <tt>-eq</tt> || (equal) Prüfen, ob zwei Zahlen gleich sind. ||  
| <tt>-eq</tt> || (equal) Prüfen, ob zwei Zahlen gleich sind. ||  


  [ $n1 -eq $n2 ]
  [ ${ZAHL_1} -eq ${ZAHL_2} ]
|-
| <tt>-ne</tt> || (not equal) Prüfen, ob zwei Zahlen nicht gleich sind. ||


[ ${ZAHL_1} -ne ${ZAHL_2} ]
|-
|-
| <tt>-ne</tt> || (not equal) Prüfen, ob zwei Zahlen nicht gleich sind. ||  
| <tt>-lt</tt> || (less than) Prüfen, ob die erste Zahl kleiner ist als die zweite. ||  


  [ $n1 -ne $n2 ]
  [ ${ZAHL_1} -lt ${ZAHL_2} ]


|-
Überprüfung, ob mindestens zwei Parameter angegeben wurden.
| <tt>-lt</tt> || (less than) Prüfen, ob die erste Zahl kleiner ist als die zweite. || Überprüfung, ob mindestens zwei Parameter angegeben wurden.


  #!/bin/sh
  #!/bin/sh
Zeile 98: Zeile 100:
     exit
     exit
  fi
  fi
|-
|-
| <tt>-le</tt> || (less equal) Prüfen, ob die erste Zahl kleiner oder gleich ist wie die zweite. ||
| <tt>-le</tt> || (less equal) Prüfen, ob die erste Zahl kleiner oder gleich ist wie die zweite. ||


  [ $n1 -le $n2 ]
  [ ${ZAHL_1} -le ${ZAHL_2} ]
 
|-
|-
| <tt>-gt</tt> || (greater than) Prüfen, ob die erste Zahl grösser ist als die zweite. ||
| <tt>-gt</tt> || (greater than) Prüfen, ob die erste Zahl grösser ist als die zweite. ||


  [ $n1 -gt $n2 ]
  [ ${ZAHL_1} -gt ${ZAHL_2} ]
 
|-
|-
| <tt>-ge</tt> || (greater equal) Prüfen, ob die erste Zahl grösser oder gleich ist wie die zweite. ||
| <tt>-ge</tt> || (greater equal) Prüfen, ob die erste Zahl grösser als oder gleich ist wie die zweite. ||
 
[ $n1 -ge $n2 ]


[ ${ZAHL_1} -ge ${ZAHL_2} ]
|}
|}


== Verwendung ==
== Verwendung ==


Überprüfung ob es sich bei der Datei "file" um eine normale Datei handelt. Falls dies zutrifft, wird die Datei angezeigt.
Das folgende testet, ob die Zeichenfolge "a" dieselbe Zeichenfolge wie "a" ist. Falls dies zutrifft lautet der Exit code 0, ansonsten 1. Der Exit code 0 bedeutet dabei grundsätzlich nur, dass der Befehl normal und ohne Fehler beendet wurde, und das macht ihn wahr.
test -f file && more file
 
oder (ab Unix System V)


  [ -f file ] && more file
  $ <b>[ "a" = "a" ]</b>
$ <b>echo $?</b>
0


Überprüfung ob es sich bei der Datei "file" um eine normale Datei handelt. Falls dies <b>nicht</b> zutrifft, erscheint auf dem Bildschirm eine entsprechende Ausgabe.
$ <b>[ "a" = "b" ]</b>
$ <b>echo $?</b>
1


  test -f file || echo "file ist keine Datei"
Überprüfung ob es sich bei der Datei "datei" um eine normale Datei handelt. Falls dies zutrifft, wird die Datei angezeigt.
   
$ <b>test -f datei && more datei</b>


oder (ab Unix System V)
oder (ab Unix System V)


  [ -f file ] || echo "file ist keine Datei"
  $ <b>[ -f datei ] && more datei</b>


Überprüfung, ob zwei ASCII-Zeichenfolgen gleich sind.
Überprüfung ob es sich bei der Datei "datei" um eine normale Datei handelt. Falls dies <b>nicht</b> zutrifft, erscheint auf dem Bildschirm eine entsprechende Ausgabe.


  test zeichenfolge1 = zeichenfolge2
  $ <b>test -f datei || echo "datei ist keine Datei"</b>


oder (ab Unix System V)
oder (ab Unix System V)


  [ "string1" = "string2" ]
  $ <b>[ -f datei ] || echo "datei ist keine Datei"</b>


Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Danach wird der Exitstatus ausgegeben (im Fall des Vorhandenseins ein "0").
Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Danach wird der Exitstatus ausgegeben (im Fall des Vorhandenseins ein "0").


  [ -d /tmp ]; echo $?
  $ <b>[ -d /tmp ]; echo $?</b>


Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Falls ja, so wird "OK" ausgegeben.
Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Falls ja, so wird "OK" ausgegeben.


  [ -d /tmp ] && echo OK
  $ <b>[ -d /tmp ] && echo "OK"</b>
 
Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Falls nein, so wird "NOK" ausgegeben.
 
[ -d /tmp ] || echo NOK


Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Falls nein, so wird "NOK" ausgegeben und "exit 1" ausgeführt.
Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Falls nein, so wird "ERROR" ausgegeben.


  [ -d /tmp ] || { echo NOK; exit 1; }
  $ <b>[ -d /tmp ] || echo "ERROR"</b>


Überprüfung, ob zwei ASCII-Zeichenfolgen <b>nicht</b> gleich sind.
Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Falls nein, so wird "ERROR" ausgegeben und "exit 1" ausgeführt.


  test "string1" != "string2"
  $ <b>[ -d /tmp ] || { echo "ERROR"; exit 1; }</b>


Abfrage, ob die Antwort "ja" ist. Alle anderen Eingaben (z. B. "Ja" oder "j") sind nicht erfolgreich.
Abfrage, ob die Antwort "ja" ist. Alle anderen Eingaben (z. B. "Ja" oder "j") sind nicht erfolgreich.
Zeile 166: Zeile 162:
  echo "Soll die Datei $1 gelöscht werden?"
  echo "Soll die Datei $1 gelöscht werden?"
  read Antwort
  read Antwort
  if [ "$Antwort" = "ja" ]
  if [ "${Antwort}" = "ja" ]
   then rm $1
   then rm $1
  fi
  fi
Zeile 172: Zeile 168:
== Weblinks ==
== Weblinks ==


{{enwi|Test_(Unix)|test (Unix)}}
{{Weblinks}}
{{url_enwikipedia|Test_(Unix)|test (Unix)}}
{{Fuss}}




{{cat|Bedingung}}
{{cat|Bedingung}}
{{cat|Kontrollfluss}}
{{cat|Shell-Befehl}}
{{cat|Shell-Befehl}}

Aktuelle Version vom 6. Mai 2024, 10:44 Uhr

Der Shell-Befehl test prüft, ob eine vorgegebene Bedingung erfüllt ist oder nicht.

Um einen sicheren Befehlsablauf zu gewährleisten, müssen vorab die Voraussetzungen geprüft werden (Plausibilitätsprüfungen). test wird verwendet

  • um zu prüfen, ob eine Datei existiert, welchem Dateityp sie angehört und welche Zugriffsrechte gesetzt sind.
  • um zu prüfen, ob bestimmte Zeichenfolgen (engl. strings) vorhanden sind.
  • um Zeichenfolgen miteinander zu vergleichen. Hierbei kann auf Textgleichheit abgefragt werden oder bei Zahlen können algebraische Vergleiche vorgenommen werden.

Als Ergebnis des Befehls test wird bei Erfolg der Exit-Status 0 zurückgeliefert, bei Misserfolg ein Wert ungleich 0. Dieses Ergebnis wird nicht angezeigt, kann aber abgefragt werden.

Optionen

Es kann jeweils nur eine Option abgefragt werden.

Option Beschreibung Beispiel
= Zeichenfolgen sind identisch.
[ "${ZEICHENFOLGE_1}" = "${ZEICHENFOLGE_2}" ]
test ${ZEICHENFOLGE_1} = ${ZEICHENFOLGE_2}

Inhalt der Variable VARIABLE ist "ja".

[ "${VARIABLE}" = "ja" ]
!= Zeichenfolgen sind nicht identisch.
[ "${ZEICHENFOLGE_1}" != "${ZEICHENFOLGE_2}" ]
test "${ZEICHENFOLGE_1}" != "${ZEICHENFOLGE_1}"
-b (block) Prüfen, ob die Datei vorhanden und ein blockorientiertes Gerät ist.
-c (character) Prüfen, ob die Datei vorhanden und ein zeichenorientiertes Gerät ist.
-d (directory) Prüfen, ob die Datei vorhanden und ein Verzeichnis ist.
-e (file) Prüfen, ob die Datei vorhanden ist.
-f (file) Prüfen, ob die Datei vorhanden und eine normale Datei ist (also kein Link o. ä.).
-n (not zero) Prüfen, ob die Variable ZEICHENKETTE nicht leer ist.
[ "${ZEICHENKETTE}" ]
[ -n "${ZEICHENKETTE}" ]
-r (read) Prüfen, ob die Datei vorhanden ist und Leseerlaubnis hat.
! -r (read) Prüfen, ob die Datei vorhanden ist und keine Leseerlaubnis hat.
-s (size) Prüfen, ob die Datei vorhanden ist und mehr als 0 byte enthält.
-w (write) Prüfen, ob die Datei vorhanden ist und Schreiberlaubnis hat.
-x (executable) Prüfen, ob die Datei vorhanden und ausführbar ist.
-z (zero) Prüfen, ob die Zeichenkette leer ist.
[ -z "${ZEICHENKETTE}" ]
-a (and) Prüfen ob beide kombinierten test-Abfragen erfolgreich sind (UND-Verknüpfung). Wenn die Datei "$Datvon" Leseberechtigung hat UND nicht bereits eine normale Datei namens "$Datnach" existiert, soll "$Datvon" unter dem Namen "$Datnach" kopiert werden.
#!/bin/sh
echo "Welche Datei soll kopiert werden?"
read Datvon
echo "Wie soll die kopierte Datei heissen?"
read Datnach
if [ -r $Datvon -a ! -f $Datnach ]
  then cp $Datvon $Datnach
fi
-o (or) Prüfen ob mindestens eine der kombinierten test-Abfragen erfolgreich ist (ODER-Verknüpfung). Abfrage, ob die Antwort "ja" ODER "j" ist. Alle anderen Eingaben (z. B. "Ja" oder "JA") sind nicht erfolgreich.
#!/bin/sh
echo "Soll die Datei $1 gelöscht werden?"
read Antwort
if [ "$Antwort" = "j" -o "$Antwort" = "ja" ]
  then rm $1
fi
-eq (equal) Prüfen, ob zwei Zahlen gleich sind.
[ ${ZAHL_1} -eq ${ZAHL_2} ]
-ne (not equal) Prüfen, ob zwei Zahlen nicht gleich sind.
[ ${ZAHL_1} -ne ${ZAHL_2} ]
-lt (less than) Prüfen, ob die erste Zahl kleiner ist als die zweite.
[ ${ZAHL_1} -lt ${ZAHL_2} ]

Überprüfung, ob mindestens zwei Parameter angegeben wurden.

#!/bin/sh
if [ "$#" -lt "2" ]
  then
    echo "Es müssen mindestens zwei Parameter angegeben werden"
    exit
fi
-le (less equal) Prüfen, ob die erste Zahl kleiner oder gleich ist wie die zweite.
[ ${ZAHL_1} -le ${ZAHL_2} ]
-gt (greater than) Prüfen, ob die erste Zahl grösser ist als die zweite.
[ ${ZAHL_1} -gt ${ZAHL_2} ]
-ge (greater equal) Prüfen, ob die erste Zahl grösser als oder gleich ist wie die zweite.
[ ${ZAHL_1} -ge ${ZAHL_2} ]

Verwendung

Das folgende testet, ob die Zeichenfolge "a" dieselbe Zeichenfolge wie "a" ist. Falls dies zutrifft lautet der Exit code 0, ansonsten 1. Der Exit code 0 bedeutet dabei grundsätzlich nur, dass der Befehl normal und ohne Fehler beendet wurde, und das macht ihn wahr.

$ [ "a" = "a" ]
$ echo $?
0
$ [ "a" = "b" ]
$ echo $?
1

Überprüfung ob es sich bei der Datei "datei" um eine normale Datei handelt. Falls dies zutrifft, wird die Datei angezeigt.

$ test -f datei && more datei

oder (ab Unix System V)

$ [ -f datei ] && more datei

Überprüfung ob es sich bei der Datei "datei" um eine normale Datei handelt. Falls dies nicht zutrifft, erscheint auf dem Bildschirm eine entsprechende Ausgabe.

$ test -f datei || echo "datei ist keine Datei"

oder (ab Unix System V)

$ [ -f datei ] || echo "datei ist keine Datei"

Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Danach wird der Exitstatus ausgegeben (im Fall des Vorhandenseins ein "0").

$ [ -d /tmp ]; echo $?

Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Falls ja, so wird "OK" ausgegeben.

$ [ -d /tmp ] && echo "OK"

Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Falls nein, so wird "ERROR" ausgegeben.

$ [ -d /tmp ] || echo "ERROR"

Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Falls nein, so wird "ERROR" ausgegeben und "exit 1" ausgeführt.

$ [ -d /tmp ] || { echo "ERROR"; exit 1; }

Abfrage, ob die Antwort "ja" ist. Alle anderen Eingaben (z. B. "Ja" oder "j") sind nicht erfolgreich.

echo "Soll die Datei $1 gelöscht werden?"
read Antwort
if [ "${Antwort}" = "ja" ]
  then rm $1
fi

Weblinks

Herausgeber Sprache Webseitentitel Anmerkungen
Wikipedia eng test (Unix)wbm Enzyklopädischer Artikel