8.2. Itération while

La commande interne while correspond à l’itération tant que présente dans de nombreux langages de programmation.


Syntaxe :    while  suite_cmd1
                  do
                    suite_cmd2
                  done
                        

La suite de commandes suite_cmd1 est exécutée; si son code de retour est égal à 0, alors la suite de commandes suite_cmd2 est exécutée, puis suite_cmd1 est réexécutée. Si son code de retour est différent de 0, alors l’itération se termine.

En d’autres termes, suite_cmd2 est exécutée autant de fois que le code de retour de suite_cmd1 est égal à 0.

L’originalité de cette structure de contrôle est que le test ne porte pas sur une condition booléenne (vraie ou fausse) mais sur le code de retour issu de l’exécution d’une suite de commandes.

En tant que mots-clé, while, do et done doivent être les premiers mots d'une commande.

Une commande while, comme toute commande interne, peut être écrite directement sur la ligne de commande.

$ > aa	# creation du fichier aa
$   
$ while  ls aa  &>/dev/null   
> do
>   echo ″le fichier aa est present″
>   sleep 5
> done
le fichier aa est présent
le fichier aa est présent
…
$

Le fonctionnement est le suivant : la commande ls aa est exécutée. Son code de retour sera égal à 0 si le fichier aa est présent dans le répertoire courant. Dans ce cas, la ligne correspondant à ce fichier sera affichée sur la sortie standard. Comme seul le code de retour est intéressant et non le résultat, la sortie standard de ls est redirigée vers le puits (/dev/null). Enfin, le message est affiché et le programme « s’endort » pendant 5 secondes. Ensuite, la commande ls aa est réexécutée et son code de retour est retesté.

Si l'utilisateur ouvre un autre terminal et y exécute la commande rm aa, le code de retour de la commande ls aa devient différent de 0 et l'itération se termine (le message d’erreur produit par la commande ls ne sera pas affiché car la sortie standard pour les messages d’erreur est également redirigée vers le puits).