while
Avec la boucle
while, par exemple, vous pouvez indiquer que certaines instructions doivent être répétées
tant qu'une condition est vraie. La structure est :
Code : Bash | while (condition)
instruction
autre instruction
encore une autre
end
|
Dans notre cas, on va donc commencer par définir une variable
gagne, initialisée à 0. Tant qu'elle vaut 0, on répète notre programme encore et encore. Lorsque l'utilisateur répond 42, on change la valeur de
gagne. La boucle ne sera donc plus répétée.
Code : Bash 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 | #!/bin/csh
set gagne = 0
while ($gagne == 0)
echo "Combien font six fois sept ?"
set reponse=$<
echo 'Vous avez saisi : '$reponse
if ($reponse == 42) then
echo "C'est la bonne reponse. Bravo !"
set gagne = 1
else if ($reponse < 42) then
echo "Vous etes en dessous de la bonne reponse."
else
echo "Vous etes au dessus de la bonne reponse."
endif
end
|
Vous voyez que j'ai laissé un nombre d'espaces différent au début de chaque ligne. On appelle cela des
indentations. Elles ne sont pas nécessaires pour l'ordinateur mais vous permettent à vous de relire plus facilement votre programme, en voyant bien ce qui fait partie de la boucle
while, ce qui fait partie du bloc
if, etc.
Dans le même esprit, comme votre script commence à s'allonger, vous pouvez y inclure des
commentaires : des lignes que l'ordinateur ignorera superbement, mais grâce auxquelles vous vous souviendrez du sens des instructions que vous avez écrites. Je vous rappelle que les lignes de commentaires commencent, en
csh, par un
#.
Voici donc notre code-source commenté :
Code : Bash 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27 | #!/bin/csh
#On initialise gagne `a 0 pour dire qu'on n'a pas encore gagne.
set gagne = 0
#La boucle principale, tant qu'on n'a pas gagne.
while ($gagne == 0)
#On pose la question et on enregistre la reponse
echo "Combien font six fois sept ?"
set reponse=$<
echo 'Vous avez saisi : '$reponse
#On compare la reponse de l'utilisateur et la bonne (42)
if ($reponse == 42) then
echo "C'est la bonne reponse. Bravo !"
set gagne = 1
#gagne vaut maintenant 1 donc la boucle ne sera pas repetee.
else if ($reponse < 42) then
echo "Vous etes en dessous de la bonne reponse."
else
echo "Vous etes au dessus de la bonne reponse."
endif
end
#Fin de la boucle principale.
|
foreach et @
On peut aussi enchaîner plusieurs questions, pour interroger plus globalement l'utilisateur sur la table de multiplication des 6.
La boucle
foreach est parfaite pour ça. Voici sa structure :
Code : Bash | foreach variable (liste des valeurs successives de la variable)
instruction
autre instruction
encore une autre
end
|
À chaque tour de la boucle, la variable change de valeur. Elle adopte les valeurs indiquées dans la parenthèse, l'une après l'autre. Ces valeurs peuvent être des nombres ou des chaînes de caractères (des mots). On peut même faire cohabiter des nombres et des mots entre les mêmes parenthèses si on veut que la variable soit un nombre au premier tour de boucle et un mot au suivant. Pour nous, ce ne serons que des nombres, ceux qu'on veut multiplier par 6.
Code : Bash | foreach multi (2 5 7 8 11)
|
L'ennui, à présent, c'est que le bon résultat sera différent à chaque tour de la boucle foreach. Ce ne sera pas toujours 42. Avant d'interroger l'utilisateur, on doit donc calculer ce résultat avec l'instruction
@.
Code : Bash
Le symbole @ signifie "fait ce calcul".
L'autre difficulté, c'est que le programme devient assez complexe, avec deux boucles imbriquées et des tests conditionnels au milieu. Pour s'y retrouver, il est donc bon de tracer un schéma.

À vous de jouer, maintenant. Je vous ai tout expliqué. Essayez d'écrire le script vous-mêmes.
Correction
Secret (cliquez pour afficher)Code : Bash 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35 | #!/bin/csh
#La boucle principale
foreach multi (2 5 7 8 11)
#Calcul du bon resultat
@ resultat = 6 * $multi
#On initialise gagne a 0 pour dire qu'on n'a pas encore gagne.
set gagne = 0
#La boucle while, tant qu'on n'a pas gagne.
while ($gagne == 0)
#On pose la question et on enregistre la reponse
echo "Combien font 6 fois "$multi" ?"
set reponse=$<
echo 'Vous avez saisi : '$reponse
#On compare la reponse de l'utilisateur et la bonne (42)
if ($reponse == $resultat) then
echo "C'est la bonne reponse. Bravo !"
set gagne = 1
#gagne vaut maintenant 1 donc la boucle while ne sera pas repetee.
else if ($reponse < $resultat) then
echo "Vous etes en dessous de la bonne reponse."
else
echo "Vous etes au dessus de la bonne reponse."
endif
end
#Fin de la boucle while.
end
#Fin de la boucle principale
echo 'Vous avez trouve toutes les bonnes reponses. Felicitations !'
|