[ -n ]
nie korzysta z -n
testu.
-n
W [ -n ]
nie jest test w ogóle. Gdy między [
i jest tylko jeden argument ]
, argument ten jest testowanym ciągiem, aby sprawdzić, czy jest pusty. Nawet jeśli ten ciąg ma wiodące -
, nadal jest interpretowany jako operand, a nie test. Ponieważ łańcuch -n
nie jest pusty - zawiera dwa znaki, -
i n
, nie zerowy characters-- [ -n ]
wartość true.
Jak mówi Ignacio Vazquez-Abrams , gdzie string
jest pojedynczy argument, test przeprowadzony na string
in jest taki sam jak test przeprowadzony na nim . Kiedy tak się dzieje , nic specjalnego się nie dzieje. W a drugi w to po prostu ciągi testowane na pustkę.[ string ]
[ -n string ]
string
-n
-n
[ -n ]
-n
[ -n -n ]
Gdy pomiędzy [
i jest tylko jeden argument ]
, argument ten jest zawsze ciągiem do przetestowania pod kątem niełaskawości, nawet jeśli przypadkiem nazywa się go tak samo jak test. Podobnie, gdy istnieją dwa argumenty pomiędzy [
i ]
i pierwszy z nich jest -n
, drugi jest zawsze ciągiem do przetestowania pod kątem nieuprzejmości, nawet jeśli zdarza się, że nazywa się tak samo jak test. Jest tak po prostu dlatego, że składnia for [
nalega, aby pojedynczy argument pomiędzy [
i ]
po -n
był operandem łańcuchowym.
Z tego samego powodu, [ -n ]
który nie korzysta z -n
testu, [ -z ]
nie korzysta z -z
testu.
Możesz dowiedzieć się więcej na temat [
w bash
badając pomoc dla niego. Zauważ, że jest to wbudowana powłoka :
$ type [
[ is a shell builtin
Możesz więc uruchomić, help [
aby uzyskać pomoc:
$ 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 `['.
Aby uzyskać więcej informacji, w tym o tym, jakie testy są obsługiwane i jak one działają, będziesz musiał zobaczyć pomoc na temat test
. Po uruchomieniu polecenia help test
otrzymasz szczegółową listę. Zamiast reprodukować wszystko, oto część o operatorach łańcuchów:
-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.
Zauważ to -n STRING
i po prostu STRING
zrób to samo: sprawdzają, czy łańcuch STRING
nie jest pusty.
[ -t ]
testowałem, czy stdout był terminalem (skrót od[ -t 1 ]
), a niektóre powłoki wciąż to robią (w przypadku,ksh93
gdy-t
jest to dosłowne), więc lepiej jest użyć[ -n "$var" ]
niż[ "$var" ]
. Chociaż nadal nie udałoby się to w niektórych starychtest
implementacjach dla wartości$var
podobnych=
, w którym to przypadku[ "" != "$var" ]
lub[ "x$var" != x ]
lubcase $x in "")...
może być lepsza.