Atribuindo valores padrão às variables ​​do shell com um único comando no bash

Eu tenho um monte de testes em variables ​​em um script de shell bash (3.00), onde se a variável não está definida, então ele atribui um padrão, por exemplo:

if [ -z "${VARIABLE}" ]; then FOO='default' else FOO=${VARIABLE} fi 

Eu pareço lembrar que há alguma syntax para fazer isso em uma linha, algo parecido com um operador ternário, por exemplo:

 FOO=${ ${VARIABLE} : 'default' } 

(embora eu saiba que não vai funcionar …)

Eu sou louco ou existe algo assim?

Muito perto do que você postou, na verdade:

 FOO=${VARIABLE:-default} # If variable not set or null, use default. 

Ou, que também atribuirá o default a VARIABLE :

 FOO=${VARIABLE:=default} # If variable not set or null, set it to default. 

Para argumentos da linha de comando:

 VARIABLE=${1:-DEFAULTVALUE} 

que atribui a VARIABLE o valor do primeiro argumento passado para o script ou o valor de DEFAULTVALUE se nenhum tal argumento foi passado.

Se a variável é a mesma, então

 : "${VARIABLE:=DEFAULT_VALUE}" 

atribui DEFAULT_VALUE a VARIABLE, se não definido. As aspas duplas evitam a globulação e a divisão de palavras.

Veja também a Seção 3.5.3, Expansão do Parâmetro do Shell , no manual do Bash.

veja aqui em 3.5.3 (expansão do parâmetro shell)

então no seu caso

 ${VARIABLE:−default} 

Mesmo você pode usar como valor padrão o valor de outra variável

tendo um arquivo defvalue.sh

 #!/bin/bash variable1=$1 variable2=${2:-$variable1} echo $variable1 echo $variable2 

execute ./defvalue.sh first-value second-value saída de ./defvalue.sh first-value second-value

 first-value second-value 

e execute a ./defvalue.sh first-value

 first-value first-value 

Então há a maneira de expressar seu constructo ‘se’ de forma mais sucinta:

 FOO='default' [ -n "${VARIABLE}" ] && FOO=${VARIABLE} 

FWIW, você pode fornecer uma mensagem de erro como:

 USERNAME=${1:?"Specify a username"} 

Isso exibe uma mensagem como esta e sai com o código 1:

 ./myscript.sh ./myscript.sh: line 2: 1: Specify a username 

Um exemplo mais completo de tudo:

 #!/bin/bash ACTION=${1:?"Specify 'action' as argv[1]"} DIRNAME=${2:-$PWD} OUTPUT_DIR=${3:-${HOMEDIR:-"/tmp"}} echo "$ACTION" echo "$DIRNAME" echo "$OUTPUT_DIR" 

Saída:

 $ ./script.sh foo foo /path/to/pwd /tmp $ export HOMEDIR=/home/myuser $ ./script.sh foo foo /path/to/pwd /home/myuser 
  • $ACTION pega o valor do primeiro argumento e sai se vazio
  • $DIRNAME é o segundo argumento e o padrão é o diretório atual
  • $OUTPUT_DIR é o terceiro argumento, ou $HOMEDIR (se definido), else, /tmp . Isso funciona no OS X, mas não tenho certeza se é portátil.

Aqui está um exemplo

 #!/bin/bash default='default_value' value=${1:-$default} echo "value: [$value]" 

salve isso como script.sh e torne-o executável. executá-lo sem params

 ./script.sh > value: [default_value] 

executá-lo com param

 ./script.sh my_value > value: [my_value] 

Para responder à sua pergunta e a todas as substituições de variables

 echo "$\{var}" echo "Substitute the value of var." echo "$\{var:-word}" echo "If var is null or unset, word is substituted for var. The value of var does not change." echo "2- $\{var:=word}" echo "If var is null or unset, var is set to the value of word." echo "$\{var:?message}" echo "If var is null or unset, message is printed to standard error. This checks that variables are set correctly." echo "$\{var:+word}" echo "If var is set, word is substituted for var. The value of var does not change."