Ajout de la boucle "select" --Bap.
This commit is contained in:
parent
95fdd248b3
commit
4b767c3279
1 changed files with 162 additions and 3 deletions
|
@ -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 ; chaque script
|
||||
consiste à poser des rails, il ne reste plus à l'utilisateur qu'à les
|
||||
parcourir.
|
||||
consiste à poser des rails : l'utilisateur n'a plus qu'à les
|
||||
suivre.
|
||||
</p>
|
||||
|
||||
<p>Toutefois, avoir posé les rails ne suffit pas toujours : il peut
|
||||
|
@ -590,6 +590,165 @@ done
|
|||
cette manière !</p>
|
||||
|
||||
|
||||
|
||||
<h2>Définir une variable : <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 :
|
||||
sont-ils favorables ou défavorables à la destruction du NIR (Nouveau
|
||||
Pavillon Rataud) et à la reconstruction du VIR (Vieux Pavillon
|
||||
Rataud) ?
|
||||
</p>
|
||||
|
||||
<p>
|
||||
Spontanément, je fais le script suivant :
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
#!/bin/sh
|
||||
# Fichier "vote-nir"
|
||||
|
||||
echo "Êtes-vous favorable au remplacement du NIR par le VIR ?"
|
||||
echo "(Répondez « pour » ou « contre »)"
|
||||
read opinion
|
||||
|
||||
# M'envoyer le résultat par mail
|
||||
echo "$opinion" | mail bourdieu
|
||||
</pre>
|
||||
|
||||
<p>Seulement voilà, de nombreuses personnes vont faire des fautes de
|
||||
frappe, et taper « poru » au lieu de « pour »,
|
||||
« cnotre » au lieu de « contre »,
|
||||
etc. Résultat : 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 !</p>
|
||||
|
||||
<p>Heureusement, il existe une parade : 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 :
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
#!/bin/sh
|
||||
# Fichier "vote-nir"
|
||||
|
||||
echo "Êtes-vous favorable au remplacement du NIR par le VIR ?"
|
||||
select opinion in Pour Contre
|
||||
do break
|
||||
done
|
||||
|
||||
# M'envoyer le résultat par mail
|
||||
echo "$opinion" | mail bourdieu
|
||||
</pre>
|
||||
|
||||
<p class="continue">
|
||||
Les utilisateurs verront alors :
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
Êtes-vous favorable au remplacement du NIR par le VIR ?
|
||||
1) Pour
|
||||
2) Contre
|
||||
</pre>
|
||||
|
||||
<p class="continue">
|
||||
Ils devront alors taper 1 ou 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 :
|
||||
</p>
|
||||
|
||||
<pre>
|
||||
#!/bin/sh
|
||||
# Fichier "piege"
|
||||
|
||||
echo "Si tu arrives à sortir de ce script, je te donne 30 euros."
|
||||
select issue in "Sortir" "Quitter"
|
||||
# la commande "continue" 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 :</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 :</p>
|
||||
|
||||
<pre>
|
||||
#!/bin/sh
|
||||
# Fichier "vote-nir"
|
||||
|
||||
echo "Êtes-vous favorable au remplacement du NIR par le VIR ?"
|
||||
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 "$opinion" | 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 ; 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>
|
||||
|
|
Loading…
Reference in a new issue