Se set -u estiver em vigor e VAR não estiver definido, [ -z "$VAR" ] causará um erro. Com [ -z "${VAR-}" ] , o valor padrão sobrescreve a verificação de uso de uma variável não definida e não há erro.
Eu vejo muitos scripts de shell (por exemplo, este ) verificando a presença / ausência de uma variável como:
[ -n "${VAR-}" ]
Tanto quanto eu posso dizer, usar o formulário ${VAR-fallback} sem fornecer um fallback não tem propósito ao verificar presença / ausência de variável ( -n ou -z ). O mesmo vale para ${VAR:-fallback} . Por exemplo, com uma variável não definida,
unset VAR
[ -z "$VAR" ] &&
[ -z "${VAR-}" ] &&
[ -z "${VAR:-}" ] &&
echo True # => True
e com uma variável nula
VAR=
[ -z "$VAR" ] &&
[ -z "${VAR-}" ] &&
[ -z "${VAR:-}" ] &&
echo True # => True
Mas eu vejo em lugares suficientes que eu tenho que perguntar, estou perdendo alguma coisa? É apenas um mal-entendido que resulta em mau uso ou existe realmente uma razão para fazê-lo?
Você está absolutamente certo - não há motivos para usar o formulário ${VAR:-} nem o formulário ${VAR-} com test -n ou test -z .
Eu não vi isso sozinho, então eu só posso imaginar que programadores de shell inexperientes podem pensar que há alguma diferença entre um valor unset e um valor vazio em relação a como test -n funciona, mas isso só poderia acontecer se test (ou seja, [ ) fosse integrado e com bugs; ou se alguém está tentando usar set -u sem pensar nas implicações de, em seguida, defender-se dessa maneira.