PROFDINFO.COM

Votre enseignant d'informatique en ligne

Section 2 - Variables, lecture, écriture et alternatives

Retour à la page du cours

Nous complexifierons un peu nos scripts en utilisant des variables et des alternatives. Nous apprendrons comment poser une question à l'usager (et surtout comment lire sa réponse!) pour des scripts plus interactifs. Nous verrons également comment vérifier le nombre de paramètres reçus afin de ne pas créer d'erreurs irréparables lorsqu'un paramètre est remplacé par du vide.

2.1 - Les variables

2.2 - La lecture et l'écriture

2.3 - Les alternatives

2.4 - Vérifier le nombre de paramètres reçus

2.5 - Exercices

2.1 - Les variables

Contrairement aux variables dans un langage de programmation comme VB, l'utilisation de variables dans les scripts est extrêmement facile.  On n'a pas besoin de déclarer une variable avant de l'utiliser, on peut s'en servir immédiatement.  On n'a pas non plus à lui définir un type comme nombre entier ou texte, on y met ce que l'on veut.

Par exemple, si je veux stocker la valeur 5 dans la variable COMPTEUR, je fais simplement:

COMPTEUR=5

Plus tard, je décide d'y mettre un mot. Je peux faire:

COMPTEUR=quatre

Et c'est tout.  Merveilleux n'est-ce pas? Évidemment, mieux vaut éviter d'utiliser une même variable pour plusieurs usages différents, question de clarté...

Ensuite, pour aller relire le contenu de la variable, je fais $COMPTEUR. La variable sera alors remplacée par son contenu et la ligne sera exécutée après coup. Par exemple:

echo "Je suis rendu à $COMPTEUR"

affichera "Je suis rendu à quatre" (sans les guillemets, bien entendu).

Par convention, on mettra le nom des variables en majuscules, bien que ça ne soit pas une nécessité. Il faut toutefois veiller à ne pas se tromper puisque Linux est sensible à la casse.

Retour à la table des matières de la section

2.2 - La lecture et l'écriture

Nous avons déjà vu comment écrire un message à l'écran, à l'aide de la commande echo. Il suffit de faire suivre la commande par le message à afficher, qui peut contenir des variables (précédés d'un $).

Dans certains cas, il faudra que la phrase à afficher soit entre guillemets, nous prendrons donc l'habitude de toujours les utiliser (ils ne peuvent pas nuire).

echo "Ceci est un exemple"

Avec la switch -n, on peut empêcher l'echo de faire un retour de chariot à la fin de la ligne (un peu comme un Console.Write):

echo -n "Ces mots et "
echo "ces mots sont sur la même ligne"

Quant à la lecture, c'est très simple: il suffit d'utiliser la commande read, qu'on fera suivre d'une variable quelconque. Le programme fera alors une pause et attendra que l'usager entre du texte suivi d'un Enter. Le texte ainsi entré se retrouvera dans la variable. Par exemple:

echo "Quel est votre nom?"
read NOM
echo "Bonjour $NOM!"
      

Ce programme sympathique nous appellera par notre nom.

Retour à la table des matières de la section

2.3 - Les alternatives

Bash implémente évidemment les alternatives et elles fonctionnent exactement comme vous y êtes habitués. La seule difficulté ici est la syntaxe un peu particulière. Une alternative est construite ainsi:

if [ condition 1 ]
then
   commandes A
elif [ condition 2 ]
then
   commandes B
else
   commandes C
fi

Notez:

  • Les conditions doivent être placés [ entre crochets ], sans oublier les espaces avants et après.
  • Le then va sur la ligne en-dessous du if. Si on veut le placer sur la même ligne, il faut placer un point-virgule entre les deux (puisque officiellement ce sont deux commandes différentes et que pour placer deux commandes sur la même ligne il faut les séparer par un point-virgule). Ça donnerait donc quelque chose comme:
    if [ condition 1 ]; then
       commandes A
  • La section elif (équivalent au else if) est facultative. Si on utilise un elif, il ne faut pas oublier sa condition, écrite de la même façon que pour un if, suivi du then.
  • On peut empiler autant de elif que désiré.
  • Le bloc else est lui aussi facultatif.
  • Tout if se termine par un fi.

On verra qu'il existe beaucoup de possibilités pour construire une condition. Pour l'instant, nous nous limiterons à:

  • "string" OP "string"
    • où OP peut être
      • == (égalité)
      • != (différence)
      • < (plus petit que)
      • <= (plus petit ou égal à)
      • > (plus grand que)
      • >= (plus grand ou égal à)
    • et où les strings sont des chaînes de caractères (les valeurs seront traitées comme telles).
    • On placera normalement les chaînes entre guillemets, bien que ça ne soit pas toujours nécessaire. Toutefois, si une variable a des chances de ne rien contenir, les guillemets autour empêcheront la ligne de provoquer une erreur. En effet:
      if [ $1 == allo ]
      

      ne sera pas valide dans le cas où $1 ne contient rien, car la ligne deviendra:

      if [ == allo ] 

      Alors qu'avec des guillemets, la ligne

      if [ "$1" == "allo" ]

      deviendrait:

      if [ "" == "allo" ]

      ce qui retournerait "faux" mais qui demeurerait syntaxiquement valide.

  • valeur OP valeur
    • où OP peut être
      • -eq (equal to, égalité)
      • -ne (not equal to, différence)
      • -lt (lesser than, plus petit que)
      • -le (lesser than or equal, plus petit ou égal à)
      • -gt (greater than, plus grand que)
      • -ge (greater than or equal, plus grand ou égal à)
    • et où les valeurs sont des nombres (le script va terminer en erreur si ce n'est pas le cas)

On peut également complexifier nos conditions avec l'utilisation d'expressions logiques. Les trois opérateurs logiques que vous connaissez sont:

  • ! (négation)
  • || (ou)
  • && (et)

Dans le cas du || et du &&, il faut placer chaque condition dans une paire de crochets différente, comme ceci:

if [ "$1" == "bonjour" ] && [ "$2" == "toi" ]; then

Dans le cas du !, on place simplement le place simplement à l'intérieur d'une paire de crochets pour inverser sa valeur logique, comme ceci (attention aux espaces):

if [ ! "$1" == "bonjour" ]; then

Évidemment, ceci est totalement équivalent à:

if [ "$1" != "bonjour" ]; then

mais on verra plus loin qu'il existe certaines conditions qui n'ont pas d'opérateur opposé et qui ont besoin du ! pour être inversées.

Retour à la table des matières de la section

2.4 - Vérifier le nombre de paramètres reçus

On l'a vu à la dernière section, il peut être désastreux d'exécuter un script nécessitant des paramètres alors qu'on ne lui en a pas donné suffisamment. En effet, les paramètres inutilisés seront remplacés par du vide et le script sera exécuté tel quel, ce qui peut être dangereux.

Il est donc sage de vérifier d'abord si on a reçu le bon nombre de paramètres avant de commencer. Pour cela, rien de plus simple: la pseudo-variable $# contient le nombre de paramètres reçus. À l'aide d'une alternative, on peut faire quelque chose comme:

#!/bin/bash
# Si on passe un paramètre à ce script, il affichera
# un message à la sortie standard et créera un fichier
# portant ce nom

if [ $# -eq 1  ]; then
   echo "Je crée ./$1"
   touch ./$1
else
   echo "Utilisation incorrecte"
fi

Retour à la table des matières de la section

2.5 - Quelques exercices

(voyez les solutions de ces exercices ici)

  1. Modifiez vos scripts de la semaine dernière pour qu'ils vérifient qu'ils ont bien reçu le bon nombre de paramètres avant de commencer. Si ce n'est pas le cas, le script doit afficher un message d'aide, expliquant l'usage correct du script, puis terminer sans faire de traitement.
  2. Modifiez votre script DetruireGroupe pour que l'on puisse utiliser la switch -d pour indiquer que l'on veut détruire répertoire du groupe. Si l'usager n'utilise pas -d, on devra détruire le groupe mais laisser le répertoire intact. On supposera que si -d est utilisé, ça devra être comme premier paramètre. Autrement dit, les usages valides seront:
  3. DetruireGroupe -d reseaux
    DetruireGroupe reseaux
    DetruireGroupe

    Dans le dernier cas, affichez le message d'aide. Supposez que l'usager n'appellera jamais votre script d'une autre façon.

  1. Faites un script appelé gestion qui affichera un menu simple comme celui-ci:
    1. Créer un groupe
    2. Renommer un groupe
    3. Détruire un groupe
    4. Créer un usager
    Le script doit ensuite saisir le choix de l'usager et lui poser les questions appropriées. Ensuite, il doit appeler le script correspondant pour faire le travail, en lui passant les réponses de l'usager en paramètres. Autrement dit, votre script gestion servira d'interface entre l'usager et vos scripts de la semaine dernière. C'est gestion qui appellera les scripts, mais comme ceux-ci s'attendent à recevoir des paramètres, gestion posera des questions à l'usager pour pouvoir passer les réponses en paramètre.

Retour à la table des matières de la section