isso ocorre porque [[ recebe uma expressão , e [ aceita argumentos que são traduzidos em uma expressão .
[[ é sintaxe - não é um comando interno como [ is, mas sim [[ é um comando composto e é mais parecido com { ou ( do que é para [ .
em qualquer caso, porque [[ é analisado ao lado $expansions , não há dificuldade em entender a diferença entre uma expansão com valor nulo e um operando ausente.
[ , no entanto, é uma execução de rotina após todas as expansões de linha de comando já ocorreram e, quando avalia suas expressões, $null_expansion já foi expandido para nada e tudo o que recebe é [ -n ] , o que não pode ser uma expressão válida. [ é spec'd para retornar true para um caso não-nulo de argumento único - como acontece para -n here - mas o mesma especificação continua dizendo ...
The two commands:
test "$1" test ! "$1"could not be used reliably on some historical systems. Unexpected results would occur if such a string expression were used and
$1expanded to!,(, or a known unary primary (such as-n). Better constructs are:test -n "$1" test -z "$1"
existem vantagens e desvantagens para ambos os formulários. As expressões [ podem ser construídas em fora de , e assim:
[ "-${z:-n}" "$var" ]
... pode ser uma maneira perfeitamente válida de criar um teste, mas não é possível com:
[[ "-${z:-n}" "$var" ]]
... o que é um comando sem sentido. As diferenças são inteiramente devidas ao ponto de análise da linha de comando no qual o teste é executado.