was ist die Option-z im Testbefehl(Linux)

In einem meiner Labor-Tutorials gab es einen Befehl, der überprüft werden sollte.

test -z $LOGNAME || echo Logname is not defined

Wenn ich diesen Befehl ausführe, lautet die Ausgabe "Logname is not defined". Manpage für Test sagt

> -z STRING
>               the length of STRING is zero

Wenn ich $LOGNAME zurückgebe, wird mein Anmeldename ausgedruckt. Es gibt also einen Wert für $LOGNAME. Im ersten Befehl oben, da der rechte Teil des Befehls ausgeführt wird, impliziert dies, dass der linke Teil false zurückgegeben hat. Warum gibt es false zurück, wenn $LOGNAME einen Wert hat?

Author: DesirePRG, 2013-06-03

2 answers

Die Zeile

test -z $LOGNAME || echo Logname is not defined

Ist ein ODER list und kann übersetzt werden als:

DO echo Logname is not defined WENN test -z $LOGNAME SCHEITERT

Wie Sie in Ihrer Frage erwähnen, prüft test -z $LOGNAME, ob $LOGNAME die Länge Null ist ... und da dies nicht der Fall ist, schlägt der Test fehl. Wenn Sie || wie folgt durch && ersetzen, erhalten Sie das gewünschte Verhalten:

test -z $LOGNAME && echo Logname is not defined

EDIT: Gemäß William Pursells Kommentar unten, test -n (Test für eine Zeichenfolge ohne Länge) und || könnte konzeptioneller Sinn machen, aber Sie müssen in diesem Fall $LOGNAME zitieren (und tatsächlich ist es eine gute Idee, Variablen im Allgemeinen zu zitieren):

test -n "$LOGNAME" || echo Logname is not defined
 6
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-06-03 13:47:19

Der Befehl Test sucht nach der Datei im aktuellen Ordner, Wenn Sie die Datei von einem anderen Speicherort aus überprüfen möchten, geben Sie den vollständigen Pfad an und verwenden Sie nicht die Option-z oder die Option-s . Sie können wie folgt tun:

Test /usr/bin/logname && echo $LOGNAME || echo Logname ist nicht definiert

Oder

- Test -s /usr/bin/logname && echo $LOGNAME || echo Logname nicht definieren

 0
Author: ,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/techietown.info/template/agent.layouts/content.php on line 61
2013-06-03 04:20:35