Variável com traço de dois pontos $ {VAR: -}

5

Como "$ {2: -}" funciona em um exemplo "if-then-else" abaixo? De alguma forma eu não posso deixar de pensar que sendo $ {2: -} isso significa o segundo argumento, mas estou curioso para saber o que os dois pontos (:) e traço (-) após o dígito 2 significam?

  if [ "${2:-}" = "Y" ]; then
     prompt="Y/n"
     default=Y
  elif [ "${2:-}" = "N" ]; then
     prompt="y/N"
     default=N
  else
     prompt="y/n"
     default=
  fi

  read -p "$1 [$prompt] " REPLY </dev/tty
    
por nocturnalmonkey 12.05.2016 / 17:54

1 resposta

8

A sintaxe ${VAR:-default} avalia o valor de VAR ou, se não for definida ou nula, será avaliada como o texto após o hífen (nesse caso, default ); a sintaxe ${VAR- default} é semelhante encurtada da função similar somente para quando a variável não está definida. $2 é um parâmetro posicional, portanto, sua instrução está testando o valor do segundo argumento e, se não estiver configurado, usando um valor vazio como padrão.

Por que usar um padrão vazio, pois isso teria o mesmo efeito que um $2 simples? Como em set -u (equivalente a set -o nounset ), a substituição de uma variável não definida causa um erro: se houver menos de dois parâmetros, $2 erros serão eliminados. Mas ${2:-} não irá errar, porque explicitamente substitui a string vazia se o parâmetro não estiver definido ou nulo.

    
por 12.05.2016 / 18:16