lundi 4 avril 2005

Les boucles


LES BOUCLES

Les boucles sont utilisées pour exécuter x fois une opération. Il existe quelques méthodes pour itérer des commandes.

Boucle for

On affiche tous les jours de la semaine. Ces derniers font partie de la liste.
for jours in Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche
do
  echo $jours
done

Au lieu d'inclure une liste (Lundi, Mardi...), il est possible de passer un paramètre. Par exemple, on pourrait afficher tous les fichiers qui commenceraient par b.
for fichier in b*
do
  echo $fichier
done
Notez qu'on aurait obtenu le même résultat en tapant ls b*
Il est possible de mettre la liste des valeurs dans une variable et ensuite de ce servir de cette dernière.
JOURS=" Lundi Mardi Mercredi Jeudi Vendredi Samedi Dimanche"
for jours in `echo $JOURS`
do
  echo $jours
done

Jusqu'à maintenant, la boucle for qu'on n'a vue n'avait rien à voir avec celle que plusieurs sont habitués d'utiliser en C. Il est bien sûr possible d'avoir une syntaxe similaire. Dans cet exemple, on affiche les chiffres de 1 à 10 et de 10 à 1.
MAX=10
MIN=0
for(( a=1, b=10; a < MAX, b > MIN; a++,b--))
do
 echo $a $b
done
Notez qu'il est obligatoire de mettre une double parenthèse. Nous avons mis deux conditions dans la boucle, aussitôt qu'une des deux est fausse, la bouche est arrêtée. Changez la valeur de MIN pour 3 par exemple et vous allez comprendre...

Boucle while

Cette boucle teste à l'entré si la condition est vraie et boucle tant que cette dernière est vrai.
i=0
j=5
while [ "$i" -lt "$j" ] # tant que i < j
do
  echo "$i"
  i=`expr $i + 1` #ou i++
done

Boucle until

On pourrait dire que cette boucle est l'opposé de la boucle while. Cette boucle teste à l'entrée la condition et boucle tant que cette dernière est fausse.
i=0
j=5
until [ "$i" -lt "$j" ] # tant que i < j
do
  echo "$i"
  i=`expr $i + 1` #ou i++
done

#on affiche i tant que i et j sont identique, bouclerais à l'infini si on n'avait pas mis la condition de test à l'intérieur.
i=0
j=0
until [ "$i" -lt "$j" ]
do
  echo "$i"
  i=`expr $i + 1` #ou i++i
  if [ $i = 8 ]; then
    j=15
  fi
done

Boucler sur un répertoire

Nous allons maintenant voir comment parcourir un répertoire, cet opération est grandement utile lorsqu'on veut effectuer un certain traitement sur des fichiers: convertir, renommer, effacer... des fichiers.
FILES="/home/collinm/Musique/*.mp3"

for file in $FILES
do
  echo $file;
done

Si vous ne voulez pas employer de variable vous devez mettre le nom du répertoire entre `, ce qui donnerait

for file in `ls /home/collinm/Musique/*.mp3`
#le reste est identique...

Nous avons complété la partie traitant des boucles. Un script avec tous les exemples peut être téléchargé ici