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
afor definido como a string vazia em vez de desanexar; -
o script anexo falhará se
anão estiver definido e a opçãonounsetestá 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.