[ -n ]non utilizza il -ntest.
L' -nin [ -n ]non è un test a tutti. Quando c'è solo un argomento tra [e ], quell'argomento è una stringa che viene testata per vedere se è vuota. Anche quando quella stringa ha un carattere iniziale -, viene comunque interpretata come un operando, non un test. Poiché la stringa -nnon è vuota - contiene due caratteri -e n, non zero caratteri - viene [ -n ]valutata come vera.
Come dice Ignacio Vazquez-Abrams , dove stringè un singolo argomento, la prova eseguita stringin è la stessa della prova effettuata su di essa . Quando succede , non succede nulla di speciale. L' in e la seconda in sono semplicemente stringhe in fase di test per il vuoto.[ string ][ -n string ]string-n-n[ -n ]-n[ -n -n ]
Quando c'è solo un argomento tra [e ], quell'argomento è sempre una stringa da testare per non vuoto, anche se capita di essere chiamato lo stesso di un test. Allo stesso modo, quando ci sono due argomenti tra [e ]e il primo è -n, il secondo è sempre una stringa da testare per non vuoto, anche se capita di essere chiamato lo stesso di un test. Questo semplicemente perché la sintassi per [insiste sul fatto che un singolo argomento tra [e ]o dopo -nsia un operando di stringa.
Per lo stesso motivo che [ -n ]non utilizza il -ntest, [ -z ]non utilizza il -ztest.
È possibile saperne di più su [nel bashesaminando l'aiuto per questo. Si noti che è incorporato una shell :
$ type [
[ is a shell builtin
Quindi puoi correre help [per ottenere aiuto su di esso:
$ 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 `['.
Per ulteriori informazioni, incluso quali test sono supportati e come funzionano, dovrai consultare la guida test. Quando esegui il comando help test, otterrai un elenco dettagliato. Invece di riprodurre tutto, ecco la parte sugli operatori di stringa:
-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.
Notalo -n STRINGe STRINGfai solo la stessa cosa: verificano se la stringa STRINGnon è vuota.
[ -t ]stava testando se stdout era un terminale (abbreviazione di[ -t 1 ]) e alcune shell lo stanno ancora facendo (nel caso diksh93solo quando-tè letterale), quindi è meglio usare[ -n "$var" ]di[ "$var" ]. Anche se ciò fallirebbe ancora in alcune vecchietestimplementazioni per valori di$varlike=, nel qual caso[ "" != "$var" ]o[ "x$var" != x ]ocase $x in "")...potrebbe essere migliore.