[ -n ]não usa o -nteste.
O -nin [ -n ]não é um teste. Quando existe apenas um argumento entre [e ], esse argumento é uma sequência testada para verificar se está vazia. Mesmo quando essa sequência tem uma liderança -, ela ainda é interpretada como um operando, não como um teste. Como a cadeia -nnão está vazia - ela contém dois caracteres -e n, não zero, de caráteres [ -n ]avaliada como verdadeira.
Como diz Ignacio Vazquez-Abrams , onde stringhá um único argumento, o teste realizado stringem é o mesmo que o realizado por ele . Quando acontece , nada de especial acontece. O in e o segundo in são simplesmente cadeias sendo testadas quanto ao vazio.[ string ][ -n string ]string-n-n[ -n ]-n[ -n -n ]
Quando existe apenas um argumento entre [e ], esse argumento é sempre uma string a ser testada para verificar se não há vazio, mesmo que seja nomeado o mesmo que um teste. Da mesma forma, quando há dois argumentos entre [e ]o primeiro deles -n, o segundo é sempre uma sequência a ser testada para verificar se não há vazios, mesmo que seja nomeado o mesmo que um teste. Isso ocorre simplesmente porque a sintaxe para [insiste em que um único argumento entre [e ]depois-n é um operando de string.
Pelo mesmo motivo que [ -n ]não usa o -nteste, [ -z ]não usa o -zteste.
Você pode aprender mais sobre [a bashexaminando a ajuda para ele. Observe que é um shell embutido :
$ type [
[ is a shell builtin
Assim, você pode executar help [para obter ajuda:
$ 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 `['.
Para obter mais informações, incluindo quais testes são suportados e como eles funcionam, você precisará ver a ajuda test. Quando você executa o comando help test, você obtém uma lista detalhada. Em vez de reproduzir tudo, aqui está a parte sobre os operadores de string:
-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.
Observe isso -n STRINGe STRINGfaça o mesmo: eles testam se a string STRINGnão está vazia.
[ -t ]foi testar se stdout foi um terminal (curto para[ -t 1 ]) e algumas conchas ainda estão fazendo isso (no caso deksh93apenas quando esse-té literal), por isso é melhor usar[ -n "$var" ]do que[ "$var" ]. Embora isso ainda falhe em algumastestimplementações antigas para valores de$varlike=, nesse caso[ "" != "$var" ]ou[ "x$var" != x ]oucase $x in "")...pode ser melhor.