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
$1
expanded 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.