Boucle while

Syntaxe :

while commande1
do
     commande2
     ...
done

La boucle while permet d'exécuter les commandes présentes entre le do et le done tant que la commande1 placée à droite du while retourne un code vrai.

Exemple :

Le script suivant demande de saisir 53 et continue tant que c'est faux

$ nl boucleWhile01.sh
     1  #!/bin/bash
     2  nbr=0
     3  while ((nbr!=53))
     4  do
     5          echo -e "Saisir 53 : \c"
     6          read nbr
     7
     8  done
     9  exit 0
$ ./boucleWhile01.sh
Saisir 53 : rt
Saisir 53 : 54
Saisir 53 : R4
Saisir 53 : 53
$

Le script suivant affiche le compteur tant qu'il est inférieur à 10

$ nl boucleWhile02.sh
     1  #!/bin/bash
     2  cpt=0
     3  while ((cpt<10))
     4  do
     5          echo "Le compteur vaut : $cpt"
     6          ((cpt+=1))
     7  done
     8  exit 0
$ ./boucleWhile02.sh
Le compteur vaut : 0
Le compteur vaut : 1
Le compteur vaut : 2
Le compteur vaut : 3
Le compteur vaut : 4
Le compteur vaut : 5
Le compteur vaut : 6
Le compteur vaut : 7
Le compteur vaut : 8
Le compteur vaut : 9
$

Le script suivant effectue une somme des nombres saisis

$ nl boucleWhile03.sh
     1  #!/bin/bash
     2  somme=0
     3  echo "Saisir un nombre, ^d pour afficher la somme"
     4  while read nombre
     5  do
     6          if [[ $nombre != +([0-9]) ]]
     7          then
     8                  echo "$nombre n'est pas un nombre"
     9                  continue
    10          fi
    11          ((somme+=nombre))
    12  done
    13  echo "La somme est de : $somme"
    14  exit 0
$ ./boucleWhile03.sh
Saisir un nombre, ^d pour afficher la somme
56
32
89
9.6
9.6 n'est pas un nombre
g8
g8 n'est pas un nombre
54
La somme est de : 231
$

Le mot clé continue permet de remonter aussitôt à la boucle while sans exécuter la commande suivante

Attention aux boucles infinies

Ce script provoqe une boucle infinie car il manque l'incrémentation du compteur

$ nl boucleWhile04.sh
     1  #!/bin/bash
     2  cpt=0
     3  while ((cpt<10))
     4  do
     5          echo "Le compteur vaut : $cpt"
     6  done
     7  exit 0
$

Le shell propose également la commande interne : qui renvoie toujours vrai et permet donc de faire une boucle infinie avec un while.

$ nl boucleWhile05.sh
     1  #!/bin/bash
     2  while :
     3  do
     4          echo "Boucle infinie"
     5  done
     6  exit 0
$

En bash et ksh, la commande true propose exactement la même chose.

$ nl boucleWhile05.sh
     1  #!/bin/bash
     2  while true
     3  do
     4          echo "Boucle infinie"
     5  done
     6  exit 0
$

Etiquettes: