web-dev-qa-db-fra.com

Affectation de valeurs par défaut à des variables Shell avec une seule commande dans bash

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?

562
Edward Q. Bridges

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.
1022
Andrew McGregor

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

235
miku

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.

199
Hans Ginzel

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
30
montells

voir ici sous 3.5.3 (Développement des paramètres du shell)

donc dans ton cas

${VARIABLE:-default}
26
ghostdog74

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

Ensuite, il y a la manière d'exprimer votre construction 'if' de manière plus concise:

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

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.
14
Curtis Mattoon

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]
9
Assaf Shomer