4. Introduction aux variables et aux paramètres

Les variables sont la façon dont tout langage de programmation ou de script représente les données. Une variable n'est rien de plus qu'un label, un nom affecté à un emplacement ou à un ensemble d'emplacements dans la mémoire de l'ordinateur contenant un élément de données.

Les variables apparaissent dans les opérations arithmétiques et dans les manipulations de quantité et dans l'analyse des chaînes.

4.1. Substitution de variable

Le nom d'une variable est un point de repère pour sa valeur, la donnée qu'elle contient. L'action de référencer sa valeur est appelée substitution de variable.

$

Commençons par distinguer soigneusement le nom d'une variable de sa valeur. Si variable1 est le nom d'une variable, alors $variable1 est une référence à sa valeur, la donnée qu'elle contient. [22]

bash$ variable=23


bash$ echo variable
variable

bash$ echo $variable
23

Les seules fois où une variable apparaît « nue », sans le symbole $ en préfixe, est lorsqu'elle est déclarée ou assignée, lorsqu'elle est détruite, lorsqu'elle est exportée, ou dans le cas particulier d'une variable désignant un signal (voir l'Exemple 29.5, « Récupérer la sortie »). Les affectations s'effectuent avec un = (comme dans var1=27), ou dans une déclaration read ou en début de boucle (for var2 in 1 2 3).

Entourer une valeur référencée de guillemets (" ") n'interfère pas avec la substitution de variable. On appelle cette action les guillemets partiels et quelque fois la protection faible. Utiliser une apostrophe (' ') provoque une utilisation littérale du nom de la variable et aucune substitution n'est effectuée. C'est ce qu'on appelle les guillemets complets ou la « protection forte ». Voir le Chapitre 5, Guillemets et apostrophes pour une discussion détaillée.

Notez que $variable est en fait une forme simplifiée de ${variable}. Dans les cas où la syntaxe $variable provoque une erreur, la forme complète peut fonctionner (voir la Section 9.3, « Substitution de paramètres », plus bas).

Exemple 4.1. Affectation de variable et substitution

#!/bin/bash
# ex9.sh

# Variables : affectation et substitution

a=375
bonjour=$a

#-------------------------------------------------------------------------
#  Aucune espace de chaque côté du signe =  n'est permis lorsque qu'on initialise
#+ des variables.
#  Que se passe-t'il s'il y a une espace ?

#  "VARIABLE =valeur",
#           ^
#% Le script tente d'exécuter la commande "VARIABLE" avec en argument "=valeur".

#  "VARIABLE= valeur",
#            ^
#% Le script tente d'exécuter la commande "valeur" avec
#+ la variable d'environnement "VARIABLE" initialisée à  "".
#-------------------------------------------------------------------------


echo bonjour    # bonjour
# Pas une référence à une variable, juste la chaine "bonjour"

echo $hello   # 375
#    ^          Ceci *est* une référence de variable.
echo ${hello} # 375
# Aussi une référence de variable, comme ci-dessus.

# Entre guillemets...
echo "$hello"    # 375
echo "${hello}"  # 375

echo

bonjour="A B  C   D"
echo $bonjour   # A B C D
echo "$bonjour" # A B  C   D
# Comme on peut le voir echo $bonjour et echo "$bonjour" donnent des résultats différents.
# Pourquoi ?
# ==========================================================
# Mettre une variable entre guillemets préserve les espaces.
# ==========================================================

echo

echo '$bonjour'  # $bonjour
#    ^        ^
#  Désactive (échappe) le référencement de variables à l'aide d'apostrophes simples,
#+ ce qui provoque l'interprétation littérale du "$".

# Notez l'effet des différents types de protection.


bonjour=    # L'affecte d'une valeur nulle
echo "\$bonjour (null value) = $bonjour"
#  Noter qu'affecter une valeur nulle à une variable n'est pas la même chose
#+ que de la "détruire" bien que le résultat final soit le même (voir plus bas).

# --------------------------------------------------------------

#  Il est tout à fait possible d'affecter plusieurs variables sur une même ligne,
#+ si elles sont séparées par des espaces.
#  Attention, cela peut rendre le script difficile à lire et peut ne pas être portable.

var1=21  var2=22  var3=$V3
echo
echo "var1=$var1   var2=$var2  var3=$var3"

# Peut causer des problèmes avec les vieilles versions de "sh"...

# --------------------------------------------------------------

echo; echo

nombres="un deux trois"
#          ^    ^
autres_nombres="1 2 3"
#                ^ ^
# En cas d'espaces à l'intérieur d'une variable, une protection est nécessaire.
#  autres_nombres=1 2 3                  # Donne un message d'erreur.
echo "nombres = $nombres"
echo "autres_nombres = $autres_nombres"   # autres_nombres = 1 2 3
#  L'échappement d'une espace blanche fonctionne aussi.
paquet_mixe=2\ ---\ Quoiquecesoit
#            ^    ^ Espace après l'échappement (\).

echo "$paquet_mixe"         # 2 --- Quoiquecesoit

echo; echo

echo "variable_non_initialisee = $variable_non_initialisee"
# Une variable non initialisée a une valeur vide  (pas de valeur du tout).
variable_non_initialisee=   #  Déclaration sans initialisation
                            #+ (même chose que de lui assigner une valeur vide
                            #+ comme ci-dessus)
echo "variable_non_initialisee = $variable_non_initialisee"
                            # Elle a encore une valeur nulle.

uninitialized_variable=23       # On lui affecte une valeur.
unset  variable_non_initialisee  # On la désaffecte.
echo "variable_non_initialisee = $variable_non_initialisee"
                                # Elle a encore une valeur nulle

echo

exit 0

[Attention]

Attention

Une variable non initialisée a une valeur « nulle » - pas de valeur assignée du tout (pas zéro !). Utiliser une variable avant de lui avoir assigné une valeur est généralement source de problèmes.

Il est néanmoins possible de réaliser des opérations arithmétiques sur une variable non initialisée.

echo "$non_initialisee"                                # (ligne vide)
let "non_initialisee += 5"                             # lui ajoute 5.
echo "$non_initialisee"                                # 5

#  Conclusion:
#  Une variable non initialisée n'a pas de valeur, néanmoins
#+ elle se comporte comme si elle contenait 0 dans une opération arithmétique.
#  C'est un comportement non documenté (et probablement non portable)
#+ qui ne devrait pas être utilisé dans un script.

Voir aussi Exemple 14.23, « Un script (inutile) qui se charge lui-même ».



[22] Techniquement, le nom d'une variable est appelé une lvalue (left value), signifiant qu'il apparaît sur le côté gauche d'une instruction d'affectation, comme dans VARIABLE=23. La valeur d'une variable est une rvalue (right value), signifiant qu'elle apparaît à la droite d'une instruction d'affectation, comme dans VAR2=$VARIABLE.

Un nom de variable est, en fait, une référence, un pointeur vers des emplacements mémoire où les données réelles associées à cette variable sont conservées.