J'ai tout un tas de tests sur les variables dans un script shell bash (3.00) dans lequel, si la variable n'est pas définie, elle assigne une valeur par défaut, par exemple:
if [ -z "${VARIABLE}" ]; then
FOO='default'
else
FOO=${VARIABLE}
fi
Il me semble que je me souviens qu'il existe une syntaxe pour faire cela en une seule ligne, quelque chose qui ressemble à un opérateur ternaire, par exemple:
FOO=${ ${VARIABLE} : 'default' }
(même si je sais que ça ne marchera pas ...)
Suis-je fou ou existe-t-il quelque chose comme ça?
Très proche de ce que vous avez posté, en fait:
FOO=${VARIABLE:-default} # If variable not set or null, use default.
Ou bien, qui assignera default
à VARIABLE
:
FOO=${VARIABLE:=default} # If variable not set or null, set it to default.
Pour les arguments en ligne de commande:
VARIABLE=${1:-DEFAULTVALUE}
qui attribue à VARIABLE
la valeur du premier argument transmis au script ou la valeur de DEFAULTVALUE
si aucun argument de ce type n'a été passé.
Si la variable est identique, alors
: "${VARIABLE:=DEFAULT_VALUE}"
assigne DEFAULT_VALUE à VARIABLE s'il n'est pas défini. Les guillemets doubles empêchent la suppression et le fractionnement de Word.
Voir également la section 3.5.3, Expansion des paramètres du shell , dans le manuel Bash.
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
lancer ./defvalue.sh first-value second-value
sortie
first-value
second-value
et lancez ./defvalue.sh first-value
sortie
first-value
first-value
Pour répondre à votre question et sur 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 "$\{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."
Ensuite, il y a la manière d'exprimer votre construction 'if' de manière plus concise:
FOO='default'
[ -n "${VARIABLE}" ] && FOO=${VARIABLE}
FWIW, vous pouvez fournir un message d'erreur comme suit:
USERNAME=${1:?"Specify a username"}
Cela affiche un message comme celui-ci et se termine 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 correspond par défaut au 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 sûr que ce soit portable.Voici un exemple
#!/bin/bash
default='default_value'
value=${1:-$default}
echo "value: [$value]"
enregistrez ceci en tant que script.sh et rendez-le exécutable. lancez-le sans paramètres
./script.sh
> value: [default_value]
lancez-le avec param
./script.sh my_value
> value: [my_value]