test -n
ist auf den ersten Blick missgebildet, da -n
ein Argument erforderlich ist. Ich glaube, einige historische Implementierungen haben es als Syntaxfehler behandelt (und einen Status ungleich Null zurückgegeben). In allen Muscheln, denen Sie im 21. Jahrhundert wahrscheinlich begegnen werden, ist das Verhalten jedoch genau definiert (von POSIX gemäß der bestehenden Praxis): Wenn test
nur ein Argument vorhanden ist, ist es genau dann wahr, wenn dieses Argument nicht vorliegt -leeren.
Beachten Sie, dass der Test für einige nicht leere Werte von möglicherweise falsch ist, wenn Sie die Anführungszeichen weglassen $VAR
. Es kann sogar eine Fehlermeldung ausdrucken, wenn sich Globbing-Zeichen befinden $VAR
.
VAR='foo -a -z bar'; test -n $VAR || echo "true... and false is false"
VAR='= n-'; test -n $VAR || echo "this is an equality test"
VAR='*'; test -n $VAR || echo "you may or may not see this depending on what files are in the current directory"
test -z $VAR
ist ähnlich kaputt.
Ksh, bash und zsh haben ein [[ … ]]
bedingtes Konstrukt, das das Traditionelle test
und die [
Dienstprogramme imitiert . Im Gegensatz dazu [
ist dies entweder ein externes Dienstprogramm oder ein integriertes Dienstprogramm, das wie eines analysiert [[ … ]]
wird, Teil der Shell-Syntax. Es gibt kein Wort, das sich im Inneren teilt oder klirrt [[ … ]]
. [[ -n $VAR ]]
ist in Ordnung (solange es Ihnen egal ist, dass Ihre Skripte nicht unter anderen Shells wie Asche ausgeführt werden).
Gilles 'SO - hör auf böse zu sein'
quelle
[[ ... ]]
ist nicht dasselbe,[ ... ]
das das gleiche Verhalten zeigt wietest
und die Funktion, auf die inman bash
... Bezug genommen wird . Innerhalb von[[ ... ]]
Variablen muss es nicht sein "$ quote", um als Variable erkannt zu werden (dh als Argument für[[
) ... Dies läuft auf einen einfachen Fall hinaus: Die Variable wurde nicht in Anführungszeichen gesetzt und sollte es auch gewesen sein.Da die Bash aufgebaut
test
ist und/usr/bin/test
zum gleichen Ergebnis führt, sage ich ja, es ist erwartetes Verhalten.quelle
Es scheint, wenn Sie Folgendes tun:
Es behandelt es so, als ob das Argument nicht da wäre:
Und wenn das Argument nicht angegeben wird, führt es aus irgendeinem Grund den Befehl immer danach aus (dh es zeigt helloworld an). Ich habe dies bei einem anderen unuären Operator versucht und es hat dasselbe getan:
Ich denke, wenn Sie erwartetes Verhalten haben wollen, müssen Sie das Argument zitieren:
Das Obige ergibt keine Meldung, die auf dem Bildschirm wiedergegeben wird.
Was ist das erwartete Verhalten? Ich kann es nirgendwo in der Dokumentation finden, aber es scheint ziemlich reproduzierbar und konsistent zu sein.
quelle