Meine Frage bezieht sich auf Rückgabewerte, die mit diesem Code erstellt wurden:
if [ -n ]; then echo "true"; else echo "false"; fi
Dies wird gedruckt true
.
Sein ergänzender Test, der [ -z ]
auch Drucke verwendet true
:
if [ -z ]; then echo "true"; else echo "false"; fi
Warum geht der [ -n ]
Test im obigen Code davon aus, dass der Zeichenfolgenwert, der überhaupt nicht übergeben wird, nicht null ist?
Der folgende Code wird gedruckt false
. Dies wird erwartet, da der übergebene Zeichenfolgenwert null ist und die Länge null hat.
if [ -n "" ]; then echo "true"; else echo "false"; fi
[ -t ]
Vergangenheit getestet wurde, ob stdout ein Terminal war (Abkürzung für[ -t 1 ]
), und dass einige Shells dies immer noch tun (ksh93
nur wenn dies-t
wörtlich ist). Daher ist es besser, es zu verwenden[ -n "$var" ]
als[ "$var" ]
. Obwohl das wäre immer noch in einigen alten scheiterntest
Implementierungen für Werte$var
wie=
, in welchem Fall[ "" != "$var" ]
oder[ "x$var" != x ]
odercase $x in "")...
besser sein kann.-o
hier. In einigen Shells wiebash
,-o
ist sowohl ein einstelliger (Test , wenn eine Option ist gesetzt) und binäre (oder) Operator, so Dinge wie[ ! -o monitor ]
mehrdeutig ist. Ist es zu testen , dass diemonitor
Option nicht gesetzt ist, oder dass entweder!
odermonitor
sind nicht leere Strings? POSIX-Regeln entscheiden: Letzteres (das ist anders bei[[ ! -o monitor ]]
).[ -n ]
benutzt den-n
Test nicht.Das
-n
In[ -n ]
ist überhaupt kein Test. Wenn zwischen[
und nur ein Argument]
steht, handelt es sich um eine Zeichenfolge, die daraufhin überprüft wird, ob sie leer ist. Auch wenn diese Zeichenfolge eine führende Position hat-
, wird sie immer noch als Operand und nicht als Test interpretiert. Da die Zeichenfolge-n
nicht leer ist - es enthält zwei Zeichen,-
undn
, nicht Null characters--[ -n ]
auswertet auf true.Wie Ignacio Vazquez-Abrams sagt ,
string
ist der Test, derstring
in ausgeführt wird, derselbe wie der Test, der von ausgeführt wird . Wann passiert, passiert nichts Besonderes. Das In und das Second In sind einfach Saiten, die auf Leere geprüft werden.[ string ]
[ -n string ]
string
-n
-n
[ -n ]
-n
[ -n -n ]
Wenn zwischen
[
und nur ein Argument steht]
, handelt es sich bei diesem Argument immer um eine Zeichenfolge, die auf Unversehrtheit geprüft werden soll, auch wenn sie zufällig den gleichen Namen hat wie ein Test. Wenn zwischen[
und zwei Argumente stehen]
und das erste Argument ein Argument ist-n
, ist das zweite immer eine Zeichenfolge, die auf Unversehrtheit geprüft werden soll, auch wenn es zufällig den gleichen Namen hat wie ein Test. Dies liegt einfach daran, dass die Syntax für[
darauf besteht, dass ein einzelnes Argument zwischen[
und]
oder nach-n
einem Zeichenfolgenoperanden ist.Aus dem gleichen Grund,
[ -n ]
der den-n
Test[ -z ]
nicht verwendet, wird der-z
Test nicht verwendet .Sie können mehr darüber erfahren ,
[
inbash
für sie durch die Untersuchung der Hilfe. Beachten Sie, dass eine Shell eingebaut ist :So können Sie laufen
help [
, um Hilfe zu bekommen:Weitere Informationen, einschließlich der unterstützten Tests und ihrer Funktionsweise, finden Sie in der Hilfe
test
. Wenn Sie den Befehl ausführenhelp test
, wird eine detaillierte Liste angezeigt. Anstatt alles zu reproduzieren, ist hier der Teil über String-Operatoren:Beachten Sie dies
-n STRING
undSTRING
machen Sie dasselbe: Sie testen, ob die ZeichenfolgeSTRING
nicht leer ist.quelle
IFS
Leerzeichen enthalten , tun dies. Variablen, die mehrere Wörter anstelle von Null enthalten, erzeugen einen anderen Effekt und können dazu führen, dass ein völlig anderer Test ausgeführt wird. Zeichenfolgen, die buchstäblich in der Absicht angezeigt werden, Operanden zu sein, funktionieren nur dann ordnungsgemäß, wenn sie keine Leerzeichen oder Tabulatoren enthalten oder in Anführungszeichen gesetzt sind. Die Antwort würde viel länger und komplizierter werden, wenn ich dieses Thema auf zugängliche Weise behandeln würde. Wenn Sie sich dazu entschließen, eine Antwort zu schreiben, wenden Sie sich bitte hier an @ me![ "$var" ]
wäre es niemals als Test verwendbar, weil$var
es sich erweitern könnte-n
.[ -n ]
ist wahr, weil der[
Befehl (alias dertest
Befehl) auf die Anzahl der Argumente wirkt, die ihm gegeben wurden. Wenn nur ein einziges Argument angegeben wird, ist das Ergebnis "true", wenn das Argument eine nicht leere Zeichenfolge ist. "-n" ist ein String mit 2 Zeichen, nicht leer, daher "true".quelle