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> <p>
Une fois que vous avez compris qu'un script n'est rien d'autre qu'une 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 suite de commandes, vous avez fait un grand pas&nbsp;; chaque script
consiste à poser des rails, il ne reste plus à l'utilisateur qu'à les consiste à poser des rails&nbsp;: l'utilisateur n'a plus qu'à les
parcourir. suivre.
</p> </p>
<p>Toutefois, avoir posé les rails ne suffit pas toujours&nbsp;: il peut <p>Toutefois, avoir posé les rails ne suffit pas toujours&nbsp;: il peut
@ -590,6 +590,165 @@ done
cette manière&nbsp;!</p> 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> <h2><a name="retour">Code de retour</a></h2>
<p> <p>
@ -626,7 +785,7 @@ fi</pre>
<div class="metainformation"> <div class="metainformation">
Auteur : Baptiste Mélès. 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> </div>
</body> </body>