test: Unterschied zwischen den Versionen
Michi (Diskussion | Beiträge) |
Michi (Diskussion | Beiträge) |
||
(18 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 | * 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> || Zeichenfolgen sind identisch. || | ||
[ "$ | |||
[ "${ZEICHENFOLGE_1}" = "${ZEICHENFOLGE_2}" ] | |||
test ${ZEICHENFOLGE_1} = ${ZEICHENFOLGE_2} | |||
Inhalt der Variable VARIABLE ist "ja". | |||
[ "${VARIABLE}" = "ja" ] | |||
|- | |- | ||
| | | <tt>!=</tt> || Zeichenfolgen sind <b>nicht</b> identisch. || | ||
[ "$ | |||
[ "${ZEICHENFOLGE_1}" != "${ZEICHENFOLGE_2}" ] | |||
test "${ZEICHENFOLGE_1}" != "${ZEICHENFOLGE_1}" | |||
|- | |- | ||
| <tt> | | <tt>-b</tt> || (block) Prüfen, ob die Datei vorhanden und ein blockorientiertes Gerät ist. | ||
|- | |- | ||
| <tt>- | | <tt>-c</tt> || (character) Prüfen, ob die Datei vorhanden und ein zeichenorientiertes Gerät ist. | ||
|- | |- | ||
| <tt> | | <tt>-d</tt> || (directory) Prüfen, ob die Datei vorhanden und ein Verzeichnis ist. | ||
|- | |- | ||
| <tt>- | | <tt>-e</tt> || (file) Prüfen, ob die Datei vorhanden ist. | ||
|- | |- | ||
| <tt>- | | <tt>-f</tt> || (file) Prüfen, ob die Datei vorhanden und eine normale Datei ist (also kein Link o. ä.). | ||
|- | |- | ||
| <tt>- | | <tt>-n</tt> || (not zero) Prüfen, ob die Variable ZEICHENKETTE nicht leer ist. || | ||
[ "${ZEICHENKETTE}" ] | |||
[ -n "${ZEICHENKETTE}" ] | |||
|- | |- | ||
| <tt>- | | <tt>-r</tt> || (read) Prüfen, ob die Datei vorhanden ist und Leseerlaubnis hat. | ||
|- | |- | ||
| <tt>- | | <tt>! -r</tt> || (read) Prüfen, ob die Datei vorhanden ist und <b>keine</b> Leseerlaubnis hat. | ||
|- | |- | ||
| <tt>- | | <tt>-s</tt> || (size) Prüfen, ob die Datei vorhanden ist und mehr als 0 byte enthält. | ||
|- | |- | ||
| <tt>- | | <tt>-w</tt> || (write) Prüfen, ob die Datei vorhanden ist und Schreiberlaubnis hat. | ||
|- | |- | ||
| <tt>- | | <tt>-x</tt> || (executable) Prüfen, ob die Datei vorhanden und ausführbar ist. | ||
|- | |- | ||
| <tt>-z</tt> || (zero) Prüfen, ob die Zeichenkette leer ist. || | | <tt>-z</tt> || (zero) Prüfen, ob die Zeichenkette leer ist. || | ||
[ -z "$ | [ -z "${ZEICHENKETTE}" ] | ||
|- | |- | ||
| <tt>-a</tt> || (and) Prüfen ob beide kombinierten< | | <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 63: | 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). | | <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 73: | 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. || | ||
[ $ | [ ${ZAHL_1} -eq ${ZAHL_2} ] | ||
|- | |||
| <tt>-ne</tt> || (not equal) Prüfen, ob zwei Zahlen nicht gleich sind. || | |||
[ ${ZAHL_1} -ne ${ZAHL_2} ] | |||
|- | |- | ||
| <tt>- | | <tt>-lt</tt> || (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 | #!/bin/sh | ||
Zeile 93: | 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. || | ||
[ $ | [ ${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. || | ||
[ $ | [ ${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. || | ||
[ ${ZAHL_1} -ge ${ZAHL_2} ] | |||
|} | |} | ||
== Verwendung == | == 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. | |||
$ <b>[ "a" = "a" ]</b> | |||
$ <b>echo $?</b> | |||
0 | |||
[ | $ <b>[ "a" = "b" ]</b> | ||
$ <b>echo $?</b> | |||
1 | |||
Überprüfung ob es sich bei der Datei " | Überprüfung ob es sich bei der Datei "datei" um eine normale Datei handelt. Falls dies zutrifft, wird die Datei angezeigt. | ||
test -f | $ <b>test -f datei && more datei</b> | ||
oder (ab Unix System V) | oder (ab Unix System V) | ||
[ -f | $ <b>[ -f datei ] && more datei</b> | ||
Überprüfung, | Ü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 | $ <b>test -f datei || echo "datei ist keine Datei"</b> | ||
oder (ab Unix System V) | oder (ab Unix System V) | ||
[ " | $ <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 " | Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Falls nein, so wird "ERROR" ausgegeben. | ||
[ -d /tmp ] || | $ <b>[ -d /tmp ] || echo "ERROR"</b> | ||
Überprüfung, ob | Überprüfung, ob das Verzeichnis "/tmp" vorhanden ist. Falls nein, so wird "ERROR" ausgegeben und "exit 1" ausgeführt. | ||
$ <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 161: | 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 167: | Zeile 168: | ||
== Weblinks == | == Weblinks == | ||
{{ | {{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 |