Assegnazione di valori predefiniti alle variabili di shell con un singolo comando in bash

Ho un sacco di test sulle variabili in uno script di shell bash (3.00) in cui, se la variabile non è impostata, assegna un valore predefinito, ad esempio:

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

Mi sembra di ricordare che c’è una certa syntax per farlo in una riga, qualcosa che assomiglia ad un operatore ternario, ad esempio:

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

(anche se so che non funzionerà …)

Sono pazzo o esiste qualcosa del genere?

Molto vicino a quello che hai postato, in realtà:

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

Oppure, che assegnerà di default anche VARIABLE :

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

Per gli argomenti della riga di comando:

 VARIABLE=${1:-DEFAULTVALUE} 

che assegna a VARIABLE il valore del primo argomento passato allo script o il valore di DEFAULTVALUE se non è stato passato alcun argomento di questo tipo.

Se la variabile è la stessa, allora

 : "${VARIABLE:=DEFAULT_VALUE}" 

assegna DEFAULT_VALUE a VARIABLE se non definito. Le doppie virgolette impediscono il globbing e la divisione delle parole.

Vedi anche Sezione 3.5.3, Espansione parametri shell , nel manuale di Bash.

vedi qui sotto 3.5.3 (espansione dei parametri della shell)

così nel tuo caso

 ${VARIABLE:−default} 

Anche tu puoi usare come valore predefinito il valore di un’altra variabile

avere un file defvalue.sh

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

lanciare ./defvalue.sh first-value second-value output di ./defvalue.sh first-value second-value

 first-value second-value 

ed esegui ./defvalue.sh first-value output di ./defvalue.sh first-value

 first-value first-value 

Poi c’è il modo di esprimere il tuo “se” costruisci più tersamente:

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

FWIW, puoi fornire un messaggio di errore in questo modo:

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

Questo visualizza un messaggio come questo ed esce con il codice 1:

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

Un esempio più completo di tutto:

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

Produzione:

 $ ./script.sh foo foo /path/to/pwd /tmp $ export HOMEDIR=/home/myuser $ ./script.sh foo foo /path/to/pwd /home/myuser 
  • $ACTION prende il valore del primo argomento ed esce se vuoto
  • $DIRNAME è il secondo argomento e ha come valore predefinito la directory corrente
  • $OUTPUT_DIR è il terzo argomento o $HOMEDIR (se definito), altrimenti, /tmp . Funziona su OS X, ma non sono sicuro che sia portatile.

Ecco un esempio

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

salvalo come script.sh e rendilo eseguibile. eseguilo senza parametri

 ./script.sh > value: [default_value] 

eseguilo con param

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

Per rispondere alla tua domanda e su tutte le sostituzioni variabili

 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."