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>
|
<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 ; chaque script
|
suite de commandes, vous avez fait un grand pas ; chaque script
|
||||||
consiste à poser des rails, il ne reste plus à l'utilisateur qu'à les
|
consiste à poser des rails : l'utilisateur n'a plus qu'à les
|
||||||
parcourir.
|
suivre.
|
||||||
</p>
|
</p>
|
||||||
|
|
||||||
<p>Toutefois, avoir posé les rails ne suffit pas toujours : il peut
|
<p>Toutefois, avoir posé les rails ne suffit pas toujours : il peut
|
||||||
|
@ -590,6 +590,165 @@ done
|
||||||
cette manière !</p>
|
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>
|
<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>
|
||||||
|
|
Loading…
Reference in a new issue