[ -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, -
und n
, nicht Null characters-- [ -n ]
auswertet auf true.
Wie Ignacio Vazquez-Abrams sagt , string
ist der Test, der string
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 , [
in bash
für sie durch die Untersuchung der Hilfe. Beachten Sie, dass eine Shell eingebaut ist :
$ type [
[ is a shell builtin
So können Sie laufen help [
, um Hilfe zu bekommen:
$ help [
[: [ arg... ]
Evaluate conditional expression.
This is a synonym for the "test" builtin, but the last argument must
be a literal `]', to match the opening `['.
Weitere Informationen, einschließlich der unterstützten Tests und ihrer Funktionsweise, finden Sie in der Hilfe test
. Wenn Sie den Befehl ausführen help test
, wird eine detaillierte Liste angezeigt. Anstatt alles zu reproduzieren, ist hier der Teil über String-Operatoren:
-z STRING True if string is empty.
-n STRING
STRING True if string is not empty.
STRING1 = STRING2
True if the strings are equal.
STRING1 != STRING2
True if the strings are not equal.
STRING1 < STRING2
True if STRING1 sorts before STRING2 lexicographically.
STRING1 > STRING2
True if STRING1 sorts after STRING2 lexicographically.
Beachten Sie dies -n STRING
und STRING
machen Sie dasselbe: Sie testen, ob die Zeichenfolge STRING
nicht leer ist.
[ -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.