Shell: por que [-n “$ {VAR-}”] em vez de [-n “$ VAR”]?

4

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?

    
por ivan 15.06.2017 / 04:32

2 respostas

7

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.

    
por 15.06.2017 / 06:10
-2

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.

    
por 15.06.2017 / 05:41