Les variables



--Téléchargez Les variables en PDF --


Le shell permet de manipuler des variables. Les variables n’ont pas besoin d’être déclarées, et elles n’ont pas de type (au sens des langages de programmation). En effet, elles ne peuvent avoir comme valeur que des objets d’un seul type : des chaînes de caractères.

Les noms de variables

Les noms des variables peuvent être composés:

  • soit d’une suite de lettres, de chiffres et du caractère _.
  • soit d’un chiffre
  • soit d’un quelconque caractères * @ # ? – $ !.

Le premier cas correspond aux variables créées par l’utilisateur, le deuxième cas correspond aux paramètres des fichiers de commandes, le troisième cas correspond à un ensemble de variables gérées par le shell.

Affectations

Pour affecter une valeur à une variable, il suffit de taper le nom de la variable, suivi du signe =, suivi de la valeur que l’on désire affecter à la variable. Par exemple :  MAVARIABLE=bonjour

Attention à ne pas laisser de blanc autour du caractère =.

Pour référencer la valeur d’une variable, on utilise la notation consistant à écrire le signe $ suivi du nom de la variable. Par exemple : echo $MAVARIABLE 

Le travail du shell consistant à remplacer $nom_de_variable par la valeur de la variable, porte le nom de substitution de variable.

Dans les exemples donnés, les noms de variables sont en majuscules. C’est utilisé par convention mais cela n’est nullement une obligation.

Affectation de la chaîne vide

On peut affecter une chaîne vide à une variable de 3 manières différentes :

Affectation et interprétation des blancs

Si la chaîne de caractères à affecter à la variable comporte des blancs, il faut en faire un seul mot à l’aide des quotes.

Les caractères « blancs » sont par défaut l’espace, la tabulation et le line-feed. On peut donc affecter une chaîne formée de plusieurs lignes.

Affectation et substitution

Dans la chaîne qui est affectée à la variable, le shell réalise la substitution de variables et la substitution de commandes, mais pas la substitution de noms de fichiers.

La variable DATE va mémoriser la date courante, la variable PERSONNE va recevoir la valeur de la variable USER, mais la variable FICHIER ne va pas recevoir comme valeur la liste des noms des fichiers, mais le caractère *.

Substitution de variables et interprétation des blancs

Le shell procède d’abord à la substitution de variables et ensuite à l’interprétation des blancs (le découpage en mots). Ceci a pour conséquence qu’il n’est pas nécessaire que la valeur d’une variable constitue un paramètre entier de commande. Le texte résultant d’une substitution de commandes peut constituer une fraction d’un paramètre de commande.

Substitution de variables et mécanisme de quote

Premier problème

Supposons que nous gérions un annuaire téléphonique sous la forme d’un fichier dont les lignes ont la structure suivante :

Soit le fichier « notel » qui recherche le numéro de téléphone de quelqu’un:

Essayons maintenant de l’utiliser en lui passant en paramètre un nom complet. Comme nous l’avons bien compris auparavant, nous entourons le nom par des « ‘ » :

On est tombé précisément sur le problème que l’on cherchait à éviter. Il faut savoir que le shell procède à la substitution de variables et ensuite à l’interprétation des blancs. La chaîne « Bob Marley » a bien été passée à notel comme un seul paramètre, mais lors du traitement de la commande grep, le shell a remplacé $1 par sa valeur et a ensuite découpé la ligne en paramètres, passant ainsi Bob et Marley comme deux paramètres à grep.

Pour résoudre le problème, il faut que dans le fichier de commandes, $1 soit pris comme un seul paramètre de grep. Il faut donc écrire : grep -i "$1" $HOME/lib/annuaire

 Second problème

Supposons que nous écrivions un fichier de commandes qui pose une question à l’utilisateur et teste la réponse.

On pose une question à l’utilisateur qui peut répondre par oui, non ou retour chariot. Le non entre crochet signifie que si l’utilisateur ne répond rien (il tape simplement retour chariot), la réponse sera considérée comme étant non. Ce fichier de commandes fonctionne correctement si on répond oui ou non, mais on a le message d’erreur :  test: argument expected si on répond par retour chariot. En effet, dans ce cas la variable réponse a pour valeur la chaîne vide, et seulement deux paramètres sont passés à test au lieu de trois. Pour résoudre le problème, il faut obliger le shell à passer $reponse en paramètre même s’il est vide.

if [ "$reponse" = oui ]

et le problème est résolu.