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.