Pascal BEAUSSART

while ... do ... done


La commande while permet d'exécuter une série de commandes tant que la condition d'exécution est remplie. Dès que la réponse est FAUX on sort de la boucle

i=0                     
while (( i < 4 ))                  --> 0
do echo "-->" $i                   --> 1
   let i+=1                        --> 2
done                               --> 3
echo "==>" $i                      ==> 4
Il est interessant d'associer les commandes while et read comme ci-après :
while read -r Nom Prenom Adresse
do if  [[ $Nom = "DURAND" ]]
   then echo $Prenom $Nom "habite :"
        echo $Adresse
   fi
done < fichier_adresse
Chaque ligne est lue et séparée dans les variables 'Nom' 'Prenom' et 'Adresse'. A la lecture de la fin de fichier la réponse est FAUX et l'on sort de la boucle.
Voir également la commande exec pour la lecture des fichiers

Nous avons cependent là une différence de comportement suivant les versions de ksh.

Sous AIX

i=1
echo "Avant la boucle i=$i"           Avant la boucle i=1  
echo "essai" | while read message
do
     let i+=1
     echo "Dans la boucle  i=$i"      Dans la boucle  i=2
done      
echo "Apres la boucle i=$i"           Apres la boucle i=2

Sous Linux

i=1
echo "Avant la boucle i=$i"           Avant la boucle i=1  
echo "essai" | while read message
do
     let i+=1
     echo "Dans la boucle  i=$i"      Dans la boucle  i=2
done      
echo "Apres la boucle i=$i"           Apres la boucle i=1
En effet, après le pipe, la commande while est considérée comme un shell fils (commande externe)
Une manière de s'en sortir est la création d'un coprocess :
# Création du coprocess

(  while true
   do
       read x
       if [[ "$x" = "EOF" ]]
       then 
           print $y
           exit
       else
           y=$x
       fi 
   done
)|&                                                   

i=1 print -p $i # initialisation du coprocess echo "Avant la boucle i=$i" Avant la boucle i=1 echo "essai" | while read message do let i+=1 echo "Dans la boucle i=$i" Dans la boucle i=2 print -p $i # Transmission au coprocess done print -p "EOF" # fin du coprocess read -p i # récupération de i echo "Apres la boucle i=$i" Apres la boucle i=2

[RETOUR] [HOME]