Avertissement pour ceux qui ont déjà fait de la programmation : le "for" en bash ne se comporte pas de la même manière que le for auquel vous êtes habitués dans un autre langage, comme le C ou le PHP. Lisez donc attentivement.
Parcourir une liste de valeurs
La boucle "for" permet de parcourir une liste de valeurs, et de boucler autant de fois qu'il n'y a de valeurs.
Concrètement, la forme d'un for est la suivante :
CitationPOUR variable PRENANT valeur1 valeur2 valeur3
FAIRE
------> effectuer_une_action
VALEUR_SUIVANTE
La "variable" va prendre successivement les valeurs "valeur1", "valeur2", "valeur3". La boucle va donc être exécutée 3 fois, et à chaque fois la variable vaudra une nouvelle valeur de la liste.
En bash, la boucle for s'écrit comme ceci :
Code : Bash1
2
3
4
5
6 | #!/bin/bash
for variable in 'valeur1' 'valeur2' 'valeur3'
do
echo "La variable vaut $variable"
done
|
Ce qui donne, si on l'exécute :
Code : Console | La variable vaut valeur1
La variable vaut valeur2
La variable vaut valeur3 |
Vous pouvez donc vous servir du for pour faire une boucle sur une liste de valeurs que vous définissez :
Code : Bash1
2
3
4
5
6 | #!/bin/bash
for animal in 'chien' 'souris' 'moineau'
do
echo "Animal en cours d'analyse : $animal"
done
|
Code : Console | Animal en cours d'analyse : chien
Animal en cours d'analyse : souris
Animal en cours d'analyse : moineau |
Toutefois, la liste de valeurs n'a pas besoin d'être définie directement dans le code. On peut utiliser une variable :
Code : Bash1
2
3
4
5
6
7
8 | #!/bin/bash
liste_fichiers=`ls`
for fichier in $liste_fichiers
do
echo "Fichier trouvé : $fichier"
done
|
Ce script liste tous les fichiers trouvés dans le répertoire actuel :
Code : Console | Fichier trouvé : boucles.sh
Fichier trouvé : conditions.sh
Fichier trouvé : variables.sh |
Bien entendu, ici on ne fait qu'afficher le nom du fichier, ce qui n'est pas très amusant ni très utile. On pourrait se servir de notre script pour renommer chacun des fichiers du répertoire actuel en leur ajoutant un suffixe -old par exemple :
Code : Bash1
2
3
4
5
6 | #!/bin/bash
for fichier in `ls`
do
mv $fichier $fichier-old
done
|
Essayons de voir si l'exécution du script renomme bien tous les fichiers :
Code : Console | $ ls
boucles.sh conditions.sh variables.sh
$ ./boucles.sh
$ ls
boucles.sh-old conditions.sh-old variables.sh-old |
A vous de jouer ! Essayez de créer un script multirenommage.sh basé sur ce principe qui va rajouter le préfixe -old... uniquement aux fichiers qui correspondent au paramètre envoyé par l'utilisateur !
Code : Console | ./multirenommage.sh *.txt |
Si aucun paramètre n'est envoyé, vous demanderez à l'utilisateur de saisir le nom des fichiers à renommer avec read.
Un for plus classique
Pour les habitués d'autres langages de programmation, le "for" est une boucle qui permet de faire prendre à une variable une suite de nombres.
En bash, comme on l'a vu, le "for" permet de parcourir une liste de valeurs. Toutefois, en trichant un peu à l'aide de la commande
seq, il est possible de simuler un for classique :
Code : Bash1
2
3
4
5 | #!/bin/bash
for i in `seq 1 10`;
do
echo $i
done
|
Explication : seq génère tous les nombres allant du premier paramètre au dernier paramètre, donc 1 2 3 4 5 6 7 8 9 10 :
Code : Console
Si vous le voulez, vous pouvez changer le pas et avancer de 2 en 2 par exemple. Dans ce cas, il faut écrire
seq 1 2 10 pour aller de 1 à 10 en avançant de 2 en 2. Cela va donc générer les nombres 1 3 5 7 9.
