Como o sinal de dois pontos e o ponto de interrogação do dólar se combinam em sh?

3

O "sinal de dois pontos" e o "ponto de interrogação do dólar" podem ser combinados para verificar se um script sh tem um argumento e o atribui diretamente a uma variável de interesse:

cmd=${1:? "Usage: $0 {build|upload|log}"}

Alguém pode explicar passo a passo como isso funciona e onde posso encontrar detalhes sobre sua implementação? Por exemplo, eu gostaria de poder chamar uma função em vez de imprimir em stderr .

help() {
  echo $"Usage: $0 {build|upload|log}"
  exit 1
}
cmd=${1:? help}

Por que isso não é possível?

    
por Anne van Rossum 15.08.2014 / 13:02

1 resposta

3

Isso é abordado na expansão de variável :

${parameter:?word}

If parameter is null or unset, the expansion of word (or a message to that effect if word is not present) is written to the standard error and the shell, if it is not interactive, exits. Otherwise, the value of parameter is substituted.

Portanto, se não houver argument com a execução do script, a variável cmd se tornará help e será gravada como padrão e retornará ao shell.

No entanto, é apenas lido e não executado. Se você rodear com backticks, então ele será executado e executado a função Usage:

help() {
  echo "Usage: $0 {build|upload|log}"
}
cmd=${1:? 'help'}

Infelizmente, isso ainda apresentará o stderr, como a expansão da variável foi projetada.

Você pode, alternativamente, fazer o seguinte:

cmd=${1:-help}
$cmd
    
por 15.08.2014 / 14:26