Question 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 attribue 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' }

(même si je sais que ça ne marchera pas ...)

Suis-je fou, ou est-ce que quelque chose comme ça existe?


422
2018-01-06 14:29


origine


Réponses:


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

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

Ou, qui assignera default à VARIABLE ainsi que:

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

725
2018-01-06 14:36



Pour les arguments de ligne de commande:

VARIABLE=${1:-DEFAULTVALUE}    

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


180
2018-01-06 14:34



Si la variable est la même, alors

: "${VARIABLE:=DEFAULT_VALUE}"

affecte DEFAULT_VALUE à VARIABLE s'il n'est pas défini. Les guillemets doubles empêchent la globalisation et la division des mots.

Voir aussi la section 3.5.3, Shell Expansion de paramètre, dans le manuel de Bash.


144
2018-01-22 09:21



voir ici sous 3.5.3 (expansion des paramètres shell)

donc dans votre cas

${VARIABLE:−default}

21
2018-01-06 14:39



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

courir ./defvalue.sh first-value second-value sortie

first-value
second-value

et courir ./defvalue.sh first-value sortie

first-value
first-value

19
2017-09-17 15:50



Ensuite, il y a la façon d'exprimer votre construction «si» plus lacunairement:

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

13
2018-01-06 14:56



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 2ème argument et par défaut dans 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.

10
2017-07-14 16:06



Voici un exemple

#!/bin/bash

default='default_value'
value=${1:-$default}

echo "value: [$value]"

enregistrez-le en tant que script.sh et rendez-le exécutable. exécutez-le sans params

./script.sh
> value: [default_value]

lance le avec param

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

7
2018-06-28 12:18



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

4
2018-02-16 14:54