4. Introduction aux variables et aux paramètres

Les variables sont le moyen dont disposent les langages de programmation ou de script pour représenter les données. Une variable n'est rien de plus qu'un libellé, un nom affecté à un emplacement ou à un ensemble d'emplacements de la mémoire de l'ordinateur qui contient un élément de données.

Les variables apparaissent dans les opérations arithmétiques ou manipulations quantitatives, et dans le traitement des chaînes de caractères.

4.1. Remplacement d'une variable par sa valeur

Le nom d'une variable est l' emplacement prévu pour une valeur, c'est-à-dire la donnée que la variable contient. L'action de dé-référencer (aller chercher) la valeur est le remplacement de la variable par sa valeur.

$

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

bash$ variable1=23

bash$ echo variable1
variable1

bash$ echo $variable1
23

Les seuls cas où une variable apparaît « nue » -- sans le préfixe $ -- , sont lorsqu'on la déclare ou qu'on l'assigne, lorsqu'on lui enlève sa valeur, lorsqu'on l'exporte, dans une expression arithmétique entre doubles parenthèses (( ... )), et dans le cas particulier d'une variable désignant un signal (voir l'Exemple 32.5, « Récupérer la sortie »). Les affectations s'effectuent à l'aide du signe = (par exemple var1=27), dans une déclaration read, ou en tête de boucle (for var2 in 1 2 3).

Entourer une valeur référencée de guillemets (" ... ") n'interfère pas avec le remplacement de la variable par sa valeur. On appelle cette situation guillemets partiels, ou encore, parfois, "protection faible". En revanche, les apostrophes (' ... ') provoquent une utilisation littérale du nom de la variable, de sorte que plus aucun remplacement n'est effectué. C'est ce qu'on appelle guillemets complets ou 'protection forte'. Pour une explication plus approfondie, voyez la section Chapitre 5, Guillemets et apostrophes.

Notez que $variable est en fait une écriture simplifiée de ${variable}. Dans les cas où la syntaxe $variable provoque une erreur, la forme complète peut parfois fonctionner (voir la section Section 10.2, « Remplacement de paramètres », ci-dessous).

Exemple 4.1. Affectation d'une variable et son remplacement par sa valeur

#!/bin/bash
# ex9.sh

# Variables : affectation et évaluation

a=375
bonjour=$a

#-------------------------------------------------------------------------
#  Aucun espace de chaque côté du signe =  n'est autorisé lorsque
#+ qu'on initialise une variable.
#  Que se passe-t-il s'il y a un espace ?

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

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


echo bonjour    # bonjour
# Ceci n'est pas une référence à une variable, juste la chaîne "bonjour"

echo $bonjour   # 375
#    ^          Cette fois, c'est bien la référence à une variable.
echo ${bonjour} # 375
# Également la référence à une variable, comme ci-dessus.

# Entre guillemets...
echo "$bonjour"    # 375
echo "${bonjour}"  # 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 (valeur nulle) = $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
#  Fonctionne aussi avec un échappement du blanc.
paquet_melange=2\ ---\ NimporteQuoi
#            ^    ^ Espace après l'échappement (\).

echo "$paquet_melange"         # 2 --- NimporteQuoi

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.

variable_non_initialisee=23       # On lui affecte une valeur.
unset  variable_non_initialisee   # On lui enlève sa valeur.
echo "variable_non_initialisee = $variable_non_initialisee"
                                  # Elle a de nouveau une valeur nulle

echo

exit 0

[Attention]

Attention

Une variable non initialisée a une valeur « vide (en anglais 'NULL') » - pas de valeur assignée du tout (mais pas zéro !).

if [ -z "$non_initialisee" ]
then
  echo "\$non_initialisee est NULL."
fi     # $non_initialisee est NULL.

Bien qu'il soit dangereux d'utiliser une variable avant de lui avoir assigné une valeur, il est possible de réaliser des opérations arithmétiques avec 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, mais dans une 
#+ opération arithmétique elle vaut tout de même 0.

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



[24]

Techniquement, le nom d'une variable est appelé une lvalue (left value), parce que ce nom apparaît du côté gauche d'une instruction d'affectation, comme dans VARIABLE=23. La valeur d'une variable est une rvalue (right value), parce qu'elle apparaît du côté droit de l'instruction d'affectation, comme dans VAR2=$VARIABLE.

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