Assigner des valeurs par défaut aux variables shell avec une seule commande dans bash

J’ai tout un tas de tests sur des variables dans un script shell bash (3.00) où, si la variable n’est pas définie, elle atsortingbue une valeur par défaut, par exemple:

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

Il me semble rappeler qu’il existe une certaine syntaxe pour faire cela dans une ligne, quelque chose qui ressemble à un opérateur ternaire, par exemple:

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

(mais je sais que ça ne marchera pas …)

Suis-je fou ou quelque chose comme ça existe?

Très proche de ce que vous avez posté, en fait:

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

Ou, qui atsortingbue également la default à VARIABLE :

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

Pour les arguments de ligne de commande:

 VARIABLE=${1:-DEFAULTVALUE} 

qui atsortingbue à VARIABLE la valeur du 1er argument passé au script ou la valeur de DEFAULTVALUE si aucun argument de ce type n’a été transmis.

Si la variable est la même, alors

 : "${VARIABLE:=DEFAULT_VALUE}" 

assigne DEFAULT_VALUE à VARIABLE si non défini. Les guillemets doubles empêchent la duplication et le fractionnement des mots.

Voir également Section 3.5.3, Extension des parameters Shell , dans le manuel Bash.

voir ici sous 3.5.3 (extension du paramètre shell)

donc dans ton cas

 ${VARIABLE:−default} 

Même vous pouvez utiliser comme valeur par défaut la valeur d’une autre variable

avoir un fichier defvalue.sh

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

exécuter ./defvalue.sh first-value second-value sortie de ./defvalue.sh first-value second-value

 first-value second-value 

et exécuter ./defvalue.sh first-value sortie de ./defvalue.sh first-value

 first-value first-value 

Ensuite, il y a le moyen d’exprimer plus simplement votre construction “si”:

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

FWIW, vous pouvez fournir un message d’erreur comme celui-ci:

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

Cela affiche un message comme celui-ci et quitte avec le code 1:

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

Un exemple plus complet de tout:

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

Sortie:

 $ ./script.sh foo foo /path/to/pwd /tmp $ export HOMEDIR=/home/myuser $ ./script.sh foo foo /path/to/pwd /home/myuser 
  • $ACTION prend la valeur du premier argument et quitte si vide
  • $DIRNAME est le deuxième argument et par défaut le répertoire en cours
  • $OUTPUT_DIR est le 3ème argument, ou $HOMEDIR (si défini), sinon, /tmp . Cela fonctionne sur OS X, mais je ne suis pas certain que ce soit portable.

Voici un exemple

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

Enregistrez-le sous le nom script.sh et rendez-le exécutable. lancez le sans params

 ./script.sh > value: [default_value] 

lance le avec param

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

Pour répondre à votre question et à toutes les substitutions 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."