if et case ne sont pas des boucles.

This commit is contained in:
Blaise Li 2011-05-11 14:51:37 +02:00
parent 590b05238b
commit 185811a266

View file

@ -19,7 +19,7 @@ href="script.html">initiation à la programmation en shell</a>).
</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
importer de disposer de mécanismes d'aiguillage. Les boucles vous importer de disposer de mécanismes d'aiguillage. Les structures de contrôle vous
permettront de réaliser ces mécanismes d'aiguillage, qui donneront à vos permettront de réaliser ces mécanismes d'aiguillage, qui donneront à vos
scripts souplesse et efficacité. </p> scripts souplesse et efficacité. </p>
@ -27,7 +27,7 @@ scripts souplesse et efficacité. </p>
<h2>Examiner une condition : <code>if</code> et <code>case</code></h2> <h2>Examiner une condition : <code>if</code> et <code>case</code></h2>
<h3>La boucle <code>if</code></h3> <h3>La structure <code>if</code></h3>
<h4>Description</h4> <h4>Description</h4>
@ -61,7 +61,7 @@ condition alternative ;</li>
<li> <code>else</code> (sinon), qui est <em>facultatif</em> et marque le <li> <code>else</code> (sinon), qui est <em>facultatif</em> et marque le
comportement à adopter si la condition n'est pas remplie ; </li> comportement à adopter si la condition n'est pas remplie ; </li>
<li> <code>fi</code> (<code>if</code> à l'envers), qui marque la fin de <li> <code>fi</code> (<code>if</code> à l'envers), qui marque la fin de
la boucle.</li> la structure de branchement.</li>
</ol> </ol>
<p>On peut donc taper :</p> <p>On peut donc taper :</p>
@ -137,7 +137,7 @@ fi
<li> <strong>Le nombre de <code>elif</code> successifs est <li> <strong>Le nombre de <code>elif</code> successifs est
illimité</strong>, alors qu'il ne peut (et c'est logique) y avoir qu'une illimité</strong>, alors qu'il ne peut (et c'est logique) y avoir qu'une
seule condition <code>if</code>, une seule instruction <code>else</code> seule condition <code>if</code>, une seule instruction <code>else</code>
et une seule instruction <code>fi</code> dans une boucle. </li> et une seule instruction <code>fi</code> correspondant au <code>if</code> initial. </li>
<li> Remarquez les dernières lignes du script : <code>$HOME</code> <li> Remarquez les dernières lignes du script : <code>$HOME</code>
est cité dans des guillemets simples, alors que <code>$PWD</code> est est cité dans des guillemets simples, alors que <code>$PWD</code> est
@ -149,11 +149,11 @@ interprété (le mot « $HOME » apparaîtra tel quel), tandis que
<h3>La boucle <code>case</code></h3> <h3>La structure <code>case</code></h3>
<h4>Quand préférer <code>case</code> à <code>if</code> ?</h4> <h4>Quand préférer <code>case</code> à <code>if</code> ?</h4>
<p>La boucle <code>if</code> est très pratique, mais devient rapidement <p>La structure de contrôle <code>if</code> est très pratique, mais devient rapidement
illisible lorsqu'un aiguillage offre plusieurs sorties, et que l'on doit illisible lorsqu'un aiguillage offre plusieurs sorties, et que l'on doit
répéter une condition pusieurs fois sous des formes à peine répéter une condition pusieurs fois sous des formes à peine
différentes. Typiquement, un programme comme celui-ci est pénible à différentes. Typiquement, un programme comme celui-ci est pénible à
@ -186,14 +186,14 @@ $PWD =</code> » ; et qui dit redondance dit possibilité de
faute de frappe &ndash; erreur particulièrement difficile à repérer faute de frappe &ndash; erreur particulièrement difficile à repérer
à l'&oelig;il nu ;</li> à l'&oelig;il nu ;</li>
<li> parce que les différentes conditions ne sont pas mises sur le même <li> parce que les différentes conditions ne sont pas mises sur le même plan
plan (<code>if</code> n'est pas, dans la boucle, sur le même plan que (au <code>if</code> correspond un <code>fi</code> mais les <code>elif</code>
<code>elif</code>, alors que logiquement les deux instructions le n'ont pas besoin d'être ainsi « refermés », alors que logiquement les deux
sont), ce qui nuit à la lisibilité.</li> instructions le sont), ce qui nuit à la lisibilité.</li>
</ol> </ol>
<p>La boucle <code>case</code> entend remédier à ces inconvénients. Il <p>La structure de contrôle <code>case</code> entend remédier à ces inconvénients. Il
s'agit tout simplement de la simplification d'un usage fréquent de la s'agit tout simplement de la simplification d'un usage fréquent de la
structure <code>if</code>. On peut récrire le programme suivant avec structure <code>if</code>. On peut récrire le programme suivant avec
<code>case</code> :</p> <code>case</code> :</p>
@ -213,8 +213,7 @@ esac
assure) :</p> assure) :</p>
<ol> <ol>
<li> la structure de la boucle et son enjeu sont <li> la structure et l'enjeu sont transparents ;</li>
transparents ;</li>
<li> la variable que l'on teste n'est citée qu'une seule fois, au lieu <li> la variable que l'on teste n'est citée qu'une seule fois, au lieu
d'être répétée à chaque instruction <code>elif</code> ;</li> d'être répétée à chaque instruction <code>elif</code> ;</li>
@ -225,7 +224,7 @@ plan.</li>
<h4>Syntaxe de <code>case</code></h4> <h4>Syntaxe de <code>case</code></h4>
<p>La boucle <code>case</code> adopte la syntaxe suivante :</p> <p>La structure <code>case</code> adopte la syntaxe suivante :</p>
<pre> <pre>
case <em>chaîne</em> in case <em>chaîne</em> in
@ -235,7 +234,7 @@ esac
</pre> </pre>
<p> <p>
La boucle <code>case</code> commence par évaluer la La structure <code>case</code> commence par évaluer la
<em>chaîne</em>. Ensuite, elle va lire chaque <em>motif</em>. Enfin, et <em>chaîne</em>. Ensuite, elle va lire chaque <em>motif</em>. Enfin, et
dès qu'une <em>chaîne</em> correspond au <em>motif</em>, elle exécute dès qu'une <em>chaîne</em> correspond au <em>motif</em>, elle exécute
les <em>commandes</em> appropriées. En anglais, <em>case</em> signifie les <em>commandes</em> appropriées. En anglais, <em>case</em> signifie
@ -254,9 +253,9 @@ fermante (qui n'est ouverte nulle part !) ;</li>
<li> la série des <em>commandes</em> est close par deux points et <li> la série des <em>commandes</em> est close par deux points et
virgules successifs (« ;; ») ; </li> virgules successifs (« ;; ») ; </li>
<li> la boucle <code>case</code> est close par l'instruction <li> la structure <code>case</code> est close par l'instruction
<code>esac</code>, qui n'est autre que le mot <code>case</code> à <code>esac</code>, qui n'est autre que le mot <code>case</code> à
l'envers (de même que la boucle <code>if</code> est terminée par l'envers (de même que la structure <code>if</code> est terminée par
l'instruction <code>fi</code>).</li> l'instruction <code>fi</code>).</li>
</ul> </ul>
@ -322,11 +321,11 @@ fautes d'inattention, qui sont particulièrement coriaces à débuguer.
</p> </p>
<div class="attention"> <div class="attention">
<p>La boucle <code>case</code> exécute les commandes correspondant au <p>La structure <code>case</code> exécute les commandes correspondant au
<strong>premier</strong> motif correct, et ne parcourt pas les motifs <strong>premier</strong> motif correct, et ne parcourt pas les motifs
suivants si elle en a trouvé un. Par conséquent, <strong>si le dernier suivants si elle en a trouvé un. Par conséquent, <strong>si le dernier
motif est « * », cela revient à l'instruction motif est « * », cela revient à l'instruction
<code>else</code> dans la boucle <code>if</code></strong>.</p> <code>else</code> dans la structure <code>if</code></strong>.</p>
</div> </div>
@ -336,7 +335,7 @@ et <code>for</code></h2>
<p>Les structures <code>if</code> et <code>case</code> sont des <p>Les structures <code>if</code> et <code>case</code> sont des
structures d'aiguillage ; les structures <code>while</code>, structures d'aiguillage ; les structures <code>while</code>,
<code>until</code> et <code>for</code> sont proprement des <code>until</code> et <code>for</code> sont des
boucles. C'est-à-dire qu'elles soumettent à une condition déterminée la boucles. C'est-à-dire qu'elles soumettent à une condition déterminée la
répétition (ou non) d'une suite de commandes.</p> répétition (ou non) d'une suite de commandes.</p>