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?
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
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