Attribuer une valeur par défaut à une variable dans un script shell

Lors de l’écriture de scripts, il est parfois utile de pouvoir attribuer une valeur par défaut à une variable si elle n’a pas été précédemment définie. Ce procédé est implémenté directement dans l’affectation des variables sous BASH (et plus généralement sous les shell POSIX).

Prenons le script suivant à titre d’exemple :

1
2
3
4
5
#!/bin/bash
 
arg=$1
 
echo ${arg}

Qui donne à l’éxécution :

fhh@mafalda ~ $ ./mytest.sh test
test
fhh@mafalda ~ $ ./mytest.sh
 
fhh@mafalda ~ $

Si le script est lancé sans argument, il retourne une ligne vide, sinon, il retourne la chaine de caractère passée en argument.

BASH implémente par défaut un test lors de l’affectation des variables du type : « si $1 est définie, arg=$1, sinon, arg=valeur ».

Pour ce faire, remplacer la ligne 3 du script précdent par l’une des syntaxe suivante :

arg=${1-valeur}

ou

arg=${1:-valeur}

A l’exécution, nous obtenons le résultat escompté :

fhh@mafalda ~ $ ./mytest.sh
valeur
fhh@mafalda ~ $ ./mytest.sh test
test

2 réflexions au sujet de « Attribuer une valeur par défaut à une variable dans un script shell »

  1. Bravo et merci pour ce site

    Petit complément pour les valeurs par défaut des variables potentiellement vides:

    arg=${1:-valeur} est efficace aussi avec les variables positionnelles
    alors que
    arg=${2:=valeur} l’est avec une variable quelconque, mais pas avec les variables positionnelles
    arg=${truc:=valeur} est efficace


    #!/bin/bash --
    echo "\$1: ${1:-defaut}" # utilisation (affichage directe) de valeur par défaut
    X=${1:-defaut} # utilisation (indirecte) de valeur par défaut
    echo "X: $X"
    echo "\$2: ${2:=defaut}" # Affectation de valeur par défaut: interdite sur $1,$2 ..
    Y=${2:=Ydefaut} # Affectation de valeur par défaut: interdite sur $1,$2 ..
    echo "Y: $Y"
    Z=${truc:=Zdefaut} # Affectation (autorisée) de valeur par défaut sur variable quelconque
    echo ${3:-defaut3} # Affectation (interdite) de valeur par défaut sur variable positionnelle
    echo "\$1: $1"
    echo "\$2: $2"
    echo "\$3: $3"
    1='truc' # Affectation interdite sur une variable positionnelle
    echo "$1"

    L’appel de ce script sans paramètre affiche:

    $1: defaut
    X: defaut
    ./essai.sh: line 5: $2 : affectation impossible de cette façon
    ./essai.sh: line 6: $2 : affectation impossible de cette façon
    Y:
    defaut3
    Z= Zdefaut
    Sans variable X: defaut
    $1:
    $2:
    $3:
    ./essai.sh: line 15: 1=truc : commande introuvable

    Ceci s’explique parceque la forme ${1:-} n’affecte pas $1
    alors que la forme ${2:=} prétend l’affecter, ce qui est impossible sur une variable positionnelle.

    1. Merci pour les compliments, ces précisions et pour le script d’illustration.
      (Au fait, je cherche des contributeurs et ce serait un plaisir de vous ouvrir les colonnes d’admin-linux alors n’hésitez pas à me contacter fhh@admin-linux.fr)

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *