Operadores de teste -v
e -z
simplesmente não são iguais.
O operador -z
informa se uma string está vazia. Portanto, é verdade que [[ -z "$a" ]]
dará uma boa aproximação de "variável a
is unset",
mas não perfeito:
-
a expressão produzirá true se
a
for definido como a string vazia em vez de desanexar; -
o script anexo falhará se
a
não estiver definido e a opçãonounset
está ativado.
Por outro lado, -v a
será exatamente "variável a
definida", mesmo
em casos de borda. Deve ficar claro que passar $a
em vez de a
para
-v
não estaria certo, pois expandiria essa possibilidade - não definida
variável antes que o operador de teste a veja; então tem que ser parte de
essa tarefa do operador para inspecionar essa variável, apontada pelo seu nome,
e diga se está definido.