Uso de: – (traço de dois pontos) no bash

Qual o significado desse estilo no bash?

${PUBLIC_INTERFACE:-eth0} 

Qual é o objective de :- ?

Se $PUBLIC_INTERFACE existir e não for nulo, retorne seu valor, caso contrário, retorne "eth0" .

Na verdade, existem alguns deles documentados na página man do bash :

$ {parameter: -word} Usar valores padrão. Se o parâmetro não for definido ou nulo, a expansão da palavra será substituída. Caso contrário, o valor do parâmetro é substituído.

$ {parameter: = word} Atribuir valores padrão. Se o parâmetro não for definido ou nulo, a expansão da palavra será atribuída ao parâmetro. O valor do parâmetro é então substituído. parameters posicionais e parâmetros especiais podem não ser atribuídos desta forma.

$ {parameter:? word} Exibir erro se for nulo ou desfeito. Se o parâmetro é nulo ou não definido, a expansão da palavra (ou uma mensagem para esse efeito se a palavra não estiver presente) é gravada no erro padrão e o shell, se não for interativo, sai. Caso contrário, o valor do parâmetro é substituído.

$ {parameter: + word} Use o valor alternativo. Se o parâmetro é nulo ou não definido, nada é substituído, caso contrário, a expansão da palavra é substituída.

:- é usado na expansão do parâmetro shell ${ parameter :- word } : se o parameter for nulo ou não definido, ele se expande para o valor da word , caso contrário, para o valor do parameter .

Exemplo:

 $ str= $ echo "${str:-default}" default 

Esta e as expansões semelhantes usando := :+ e :? todos vêm em dois sabores: com e sem dois pontos. A diferença é que a expansão com o cólon entra em “nulo ou não definido “, enquanto que sem o cólon, é apenas “nula”.

Observar:

 $ str= # Null, but not unset $ echo "${str-default}" # Expands to value of $str, the empty string $ echo "${str:-default}" # Expands to "default" default 

Onde isso é útil? Alguns exemplos:

  • Valores padrão

    • O editor invocado para editar o último comando com fc é o resultado da expansão ${FCEDIT:-${EDITOR:-vi}} : $FCEDIT se definido, ou então $EDITOR se definido, ou então vi .
    • Um loop em um script que deve ser lido de um arquivo se for fornecido como um argumento e, da input padrão, poderia ser assim:

       while IFS= read -r line; do # do something done < "${1:-/dev/stdin}" 
  • Ao usar set -u

    set -u é uma maneira útil de forçar scripts mais limpos fazendo com que o script morra ao encontrar uma variável unset, conforme promovido por, por exemplo, este artigo (não que eu endosse tudo lá 1 ). Se quisermos verificar se uma determinada variável tem um valor com [[ $var ]] , o script agora morre se var não estiver definido, mesmo que isso possa ser legítimo.

    A maneira como isso está usando [[ ${var:-} ]] e set -u não vai reclamar. (Isso é basicamente usando um valor padrão novamente, mas o valor substituído é a string vazia neste caso.)

Essas expansões não são exclusivas do Bash, a propósito: a especificação do shell POSIX também possui todas elas.


1 Veja também BashFAQ / 112, Quais são as vantagens e desvantagens de usar set -u (ou set -o nounset )?