Ajout de la boucle "select" --Bap.

This commit is contained in:
meles 2005-06-03 14:59:10 +00:00
parent 95fdd248b3
commit 4b767c3279

View file

@ -13,8 +13,8 @@
<p>
Une fois que vous avez compris qu'un script n'est rien d'autre qu'une
suite de commandes, vous avez fait un grand pas&nbsp;; chaque script
consiste à poser des rails, il ne reste plus à l'utilisateur qu'à les
parcourir.
consiste à poser des rails&nbsp;: l'utilisateur n'a plus qu'à les
suivre.
</p>
<p>Toutefois, avoir posé les rails ne suffit pas toujours&nbsp;: il peut
@ -590,6 +590,165 @@ done
cette manière&nbsp;!</p>
<h2>Définir une variable&nbsp;: <code>select</code></h2>
<p>
Il est parfois utile de donner à l'utilisateur du script des formulaires
sous forme de <strong>questions à choix multiples</strong>.</p>
<p> Par exemple, je suis sociologue et je veux dresser des statistiques
sur les opinions d'un échantillon représentatif de normaliens&nbsp;:
sont-ils favorables ou défavorables à la destruction du NIR (Nouveau
Pavillon Rataud) et à la reconstruction du VIR (Vieux Pavillon
Rataud)&nbsp;?
</p>
<p>
Spontanément, je fais le script suivant&nbsp;:
</p>
<pre>
#!/bin/sh
# Fichier &quot;vote-nir&quot;
echo &quot;Êtes-vous favorable au remplacement du NIR par le VIR&nbsp;?&quot;
echo &quot;(Répondez « pour » ou « contre »)&quot;
read opinion
# M'envoyer le résultat par mail
echo &quot;$opinion&quot; | mail bourdieu
</pre>
<p>Seulement voilà, de nombreuses personnes vont faire des fautes de
frappe, et taper «&nbsp;poru&nbsp;» au lieu de «&nbsp;pour&nbsp;»,
«&nbsp;cnotre&nbsp;» au lieu de «&nbsp;contre&nbsp;»,
etc. Résultat&nbsp;: au lieu de laisser d'autres scripts traiter
automatiquement les résultats des statistiques qui me sont envoyés par
courriel, je devrai tout regarder à la main et cocher moi-même les
résultats pour ne pas en oublier. Dans ce cas, autant faire un sondage
classique à la sortie du Pot&nbsp;!</p>
<p>Heureusement, il existe une parade&nbsp;: la boucle
<code>select</code>. </p>
<h4>Syntaxe de <code>select</code></h4>
<pre>
select <em>variable</em> in <em>valeurs possibles</em>
do <em>commandes</em>
done
</pre>
<h4>Questions à choix multiples</h4>
<p>
Voici le script de notre sociologue&nbsp;:
</p>
<pre>
#!/bin/sh
# Fichier &quot;vote-nir&quot;
echo &quot;Êtes-vous favorable au remplacement du NIR par le VIR&nbsp;?&quot;
select opinion in Pour Contre
do break
done
# M'envoyer le résultat par mail
echo &quot;$opinion&quot; | mail bourdieu
</pre>
<p class="continue">
Les utilisateurs verront alors&nbsp;:
</p>
<pre>
Êtes-vous favorable au remplacement du NIR par le VIR ?
1) Pour
2) Contre
</pre>
<p class="continue">
Ils devront alors taper&nbsp;1 ou&nbsp;2, selon leur opinion.
</p>
<p>Vous avez remarqué que l'instruction <code>do</code> est suivie de la
commande <code>break</code>. Celle-ci indique de sortir de la boucle
<code>select</code>. Sans <code>break</code>, <code>select</code> est en
effet une boucle, comme <code>while</code>, <code>until</code> et
<code>for</code>. Nous allons voir pourquoi.</p>
<h4>Utiliser <code>select</code> comme boucle</h4>
<p>
Par défaut, <code>select</code> se comporte comme une boucle. Observons
le comportement du script suivant&nbsp;:
</p>
<pre>
#!/bin/sh
# Fichier &quot;piege&quot;
echo &quot;Si tu arrives à sortir de ce script, je te donne 30&nbsp;euros.&quot;
select issue in &quot;Sortir&quot; &quot;Quitter&quot;
# la commande &quot;continue&quot; est une commande vide : elle ne fait rien de spécial
do continue
done
</pre>
<p class="continue">Essayez maintenant d'exécuter ce script&nbsp;:</p>
<pre>
Si tu arrives à sortir de ce script, je te donne 30 euros.
1) Sortir
2) Quitter
#? <em>1</em>
#? <em>2</em>
#? <em>1</em>
#? <em>2</em>
#? <em>1</em>
<em>(etc.)</em>
</pre>
<p>Ce comportement est parfois utile, par exemple si vous programmez un
petit jeu, ou autre. Ou encore, pour prévenir les réponses non
valides. Exemple&nbsp;:</p>
<pre>
#!/bin/sh
# Fichier &quot;vote-nir&quot;
echo &quot;Êtes-vous favorable au remplacement du NIR par le VIR&nbsp;?&quot;
select opinion in Pour Contre
do
case $opinion in
# Laisser passer ceux qui répondent correctement à la question
"Pour"|"Contre") break;;
# Au cas où des zozos tapent sur autre chose que 1 ou 2
"*") continue;;
esac
done
# M'envoyer le résultat par mail
echo &quot;$opinion&quot; | mail bourdieu
</pre>
<p class="continue">Grâce à cela, si un normalien tape une réponse
invalide, <code>select</code> attend qu'il tape quelque chose de
correct&nbsp;; s'il tape quelque chose de correct, la réponse est
envoyée au sociologue.</p>
<div class="attention">
<p>
Vous aurez remarqué au passage que <strong>l'on peut sans problème
imbriquer des structures de contrôle les unes dans les autres</strong>.
</p>
</div>
<h2><a name="retour">Code de retour</a></h2>
<p>
@ -626,7 +785,7 @@ fi</pre>
<div class="metainformation">
Auteur : Baptiste Mélès.
Dernière modification le <date value="$Date: 2005-06-03 13:56:21 $" />.
Dernière modification le <date value="$Date: 2005-06-03 14:59:10 $" />.
</div>
</body>