GNU/Linux >> Tutoriels Linux >  >> Linux

12 exemples de boucle Bash For pour votre script de shell Linux

Il existe deux types de boucles for bash disponibles. L'un utilisant le mot-clé "in" avec une liste de valeurs, l'autre utilisant la syntaxe de programmation C.

Cet article fait partie de notre série de tutoriels bash en cours.

Cela explique les deux méthodes de boucle bash for et fournit 12 exemples différents sur la façon d'utiliser la boucle bash for dans vos scripts shell.

Mettez cet article en signet pour référence future, car c'est le seul article que vous aurait jamais besoin de se référer à la façon d'utiliser bash for loops avec des exemples.

Méthode 1 :Bash For Loop en utilisant "in" et une liste de valeurs

Syntaxe :

for varname in list
do
 command1
 command2
 ..
done

Dans la syntaxe ci-dessus :

  • for, in, do et done sont des mots clés
  • "list" contient une liste de valeurs. La liste peut être une variable contenant plusieurs mots séparés par des espaces. Si la liste est manquante dans l'instruction for, elle prend le paramètre de position qui a été transmis au shell.
  • varname est n'importe quel nom de variable Bash.

Sous cette forme, l'instruction for exécute les commandes contenues dans un corps, une fois pour chaque élément de la liste. Par exemple, si la liste de valeurs contient 5 éléments, la boucle for sera exécutée 5 fois au total, une fois pour chaque élément de la liste. L'élément actuel de la liste sera stocké dans une variable "varname" à chaque fois dans la boucle. Ce « varname » peut être traité dans le corps de la boucle for.

Méthode 2 :Bash For Loop utilisant une syntaxe de type C

La deuxième forme de la boucle for est similaire à la boucle for du langage de programmation "C", qui comporte trois expressions (initialisation, condition et mise à jour).

for (( expr1; expr2; expr3 ))
do
 command1
 command2
 ..
done

Dans le bash ci-dessus pour la syntaxe de commande,

  • Avant la première itération, expr1 est évalué. Ceci est généralement utilisé pour initialiser les variables de la boucle.
  • Toutes les instructions entre do et done sont exécutées de manière répétée jusqu'à ce que la valeur de expr2 soit TRUE.
  • Après chaque itération de la boucle, expr3 est évalué. Ceci est généralement utilisé pour incrémenter un compteur de boucle.

Les 12 exemples suivants montrent comment frapper des boucles for de différentes manières.

1. Valeurs statiques pour la liste après le mot-clé "in"

Dans l'exemple suivant, la liste de valeurs (Mon, Tue, Wed, Thu et Fri) est donnée directement après le mot-clé "in" dans la boucle bash for.

$ cat for1.sh
i=1
for day in Mon Tue Wed Thu Fri
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Attention : La liste des valeurs ne doit pas être séparée par une virgule (Mon, Tue, Wed, Thu, Fri). La virgule sera traitée comme faisant partie de la valeur. c'est-à-dire qu'au lieu de "Mon", il utilisera "Mon" comme valeur, comme indiqué dans l'exemple ci-dessous.

$ cat for1-wrong1.sh
i=1
for day in Mon, Tue, Wed, Thu, Fri
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1-wrong1.sh
Weekday 1 : Mon,
Weekday 2 : Tue,
Weekday 3 : Wed,
Weekday 4 : Thu,
Weekday 5 : Fri

Attention : La liste de valeurs ne doit pas être entourée de guillemets doubles. ("Lun Mar Mer Jeu Ven"). Si vous placez des guillemets doubles, il sera traité comme une valeur unique (au lieu de 5 valeurs différentes), comme indiqué dans l'exemple ci-dessous.

$ cat for1-wrong2.sh
i=1
for day in "Mon Tue Wed Thu Fri"
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1-wrong2.sh
Weekday 1 : Mon Tue Wed Thu Fri

2. Variable pour la liste après le mot-clé "in"

Au lieu de fournir les valeurs directement dans la boucle for, vous pouvez stocker les valeurs dans une variable et utiliser la variable dans la boucle for après le mot-clé "in", comme illustré dans l'exemple suivant.

$ cat for2.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays
do
 echo "Weekday $((i++)) : $day"
done

$ ./for2.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Attention :En tant que meilleure pratique, vous devez toujours citer les variables bash lorsque vous y faites référence. Il existe peu d'exceptions à cette règle de bonne pratique. C'est l'un d'eux. Si vous mettez la variable entre guillemets dans cette boucle for, la liste de valeurs sera traitée comme une valeur unique. Beaucoup de gens tombent dans ce piège. Soyez prudent et ne doublez pas les guillemets de votre variable dans la boucle for.

$ cat for2-wrong.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in "$weekdays"
do
 echo "Weekday $((i++)) : $day"
done

$ ./for2-wrong.sh
Weekday 1 : Mon Tue Wed Thu Fri

3. Ne spécifiez pas la liste ; l'obtenir à partir des paramètres de position

Si vous ne spécifiez pas le mot-clé "in" suivi d'une liste de valeurs dans la boucle bash for, il utilisera les paramètres positionnels (c'est-à-dire les arguments transmis au script shell).

$ cat for3.sh
i=1
for day
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3.sh Mon Tue Wed Thu Fri
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Attention : Soyez prudent si vous utilisez cette méthode. Vous ne devez pas inclure le mot-clé "in" dans la boucle for. Si vous laissez le mot-clé "in" sans aucune valeur, il n'utilisera pas le paramètre positionnel comme indiqué ci-dessous. Il n'ira pas à l'intérieur de la boucle. c'est-à-dire que la boucle for ne sera jamais exécutée comme indiqué dans l'exemple ci-dessous.

$ cat for3-wrong.sh
i=1
for day in
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3-wrong.sh Mon Tue Wed Thu Fri

Remarque  :Reportez-vous à notre article précédent pour en savoir plus sur les paramètres de position bash.

4. Sortie de la commande Unix sous forme de valeurs de liste après le mot-clé "in"

Vous pouvez utiliser la sortie de n'importe quelle commande UNIX / Linux comme liste de valeurs dans la boucle for en entourant la commande de back-ticks ` ` comme indiqué ci-dessous.

$ cat for4.sh
i=1
for username in `awk -F: '{print $1}' /etc/passwd`
do
 echo "Username $((i++)) : $username"
done

$ ./for4.sh
Username 1 : ramesh
Username 2 : john
Username 3 : preeti
Username 4 : jason
..

5. Parcourez les fichiers et les répertoires dans une boucle for

Pour parcourir les fichiers et les répertoires d'un répertoire spécifique, accédez simplement à ce répertoire et saisissez * dans la boucle for comme indiqué ci-dessous.

L'exemple suivant parcourt tous les fichiers et répertoires sous votre répertoire personnel.

$ cat for5.sh
i=1
cd ~
for item in *
do
 echo "Item $((i++)) : $item"
done

$ ./for5.sh
Item 1 : positional-parameters.sh
Item 2 : backup.sh
Item 3 : emp-report.awk
Item 4 : item-list.sed
Item 5 : employee.db
Item 8 : storage
Item 9 : downloads

L'utilisation de * dans la boucle bash for est similaire au fichier global que nous utilisons dans la ligne de commande linux lorsque nous utilisons la commande ls (et d'autres commandes).

Par exemple, ce qui suit affichera tous les fichiers et répertoires sous votre répertoire personnel. C'est le concept qui est utilisé dans l'exemple for5.sh ci-dessus.

cd ~
ls *

Ce qui suit affichera tous les fichiers *.conf commençant par a, b ou c ou d sous le répertoire /etc.

$ ls -1 /etc/[abcd]*.conf
/etc/asound.conf
/etc/autofs_ldap_auth.conf
/etc/cas.conf
/etc/cgconfig.conf
/etc/cgrules.conf
/etc/dracut.conf

Le même argument que celui utilisé dans la commande ls ci-dessus peut être utilisé dans une boucle bash for, comme indiqué dans l'exemple ci-dessous.

$ cat for5-1.sh
i=1
for file in /etc/[abcd]*.conf
do
 echo "File $((i++)) : $file"
done

$ ./for5-1.sh
File 1 : /etc/asound.conf
File 2 : /etc/autofs_ldap_auth.conf
File 3 : /etc/cas.conf
File 4 : /etc/cgconfig.conf
File 5 : /etc/cgrules.conf
File 6 : /etc/dracut.conf

6. Sortir de la boucle for

Vous pouvez sortir d'une boucle for en utilisant la commande "break" comme indiqué ci-dessous.

$ cat for6.sh
i=1
for day in Mon Tue Wed Thu Fri
do
 echo "Weekday $((i++)) : $day"
 if [ $i -eq 3 ]; then
   break;
 fi
done

$ ./for6.sh
Weekday 1 : Mon
Weekday 2 : Tue

7. Continuer à partir du haut de la boucle for

Sous certaines conditions, vous pouvez ignorer le reste des commandes dans la boucle for et continuer la boucle à partir du haut (pour la valeur suivante dans la liste), en utilisant la commande continue comme indiqué ci-dessous.

L'exemple suivant ajoute "(WEEKEND)" à Sam et Sun, et "(weekday)" au reste des jours.

$ cat for7.sh
i=1
for day in Mon Tue Wed Thu Fri Sat Sun
do
 echo -n "Day $((i++)) : $day"
 if [ $i -eq 7 -o $i -eq 8 ]; then
   echo " (WEEKEND)"
   continue;
 fi
 echo " (weekday)"
done

$ ./for7.sh
Day 1 : Mon (weekday)
Day 2 : Tue (weekday)
Day 3 : Wed (weekday)
Day 4 : Thu (weekday)
Day 5 : Fri (weekday)
Day 6 : Sat (WEEKEND)
Day 7 : Sun (WEEKEND)

8. Bash for loop utilisant la syntaxe du programme C

Cet exemple utilise la 2ème méthode de la boucle for bash, qui est similaire à la syntaxe de la boucle for C. L'exemple suivant génère 5 nombres aléatoires à l'aide de la boucle for de style C bash.

$ cat for8.sh
for (( i=1; i <= 5; i++ ))
do
 echo "Random number $i: $RANDOM"
done

$ ./for8.sh
Random number 1: 23320
Random number 2: 5070
Random number 3: 15202
Random number 4: 23861
Random number 5: 23435

9. Boucle Bash for infinie

Lorsque vous ne fournissez pas le début, la condition et l'incrément dans la boucle for de style C bash, elle deviendra une boucle infinie. Vous devez appuyer sur Ctrl-C pour arrêter la boucle.

$ cat for9.sh
i=1;
for (( ; ; ))
do
   sleep $i
   echo "Number: $((i++))"
done

Comme nous l'avons dit ci-dessus, appuyez sur Ctrl-C pour sortir de cet exemple bash de boucle infinie.

$ ./for9.sh
Number: 1
Number: 2
Number: 3

10. Utilisation d'une virgule dans la boucle for bash de style C

Dans la boucle bash de style c, outre l'incrémentation de la valeur utilisée dans la condition, vous pouvez également incrémenter une autre valeur, comme indiqué ci-dessous.

Dans la section d'initialisation et la section d'incrémentation de la boucle for de style C bash, vous pouvez avoir plusieurs valeurs en les séparant par une virgule, comme indiqué ci-dessous.

La boucle for suivante est exécutée 5 fois au total, en utilisant la variable i. Cependant, la variable j commence par 5 et s'incrémente de 5 à chaque fois que la boucle est exécutée.

$ cat for10.sh
for ((i=1, j=10; i <= 5 ; i++, j=j+5))
do
 echo "Number $i: $j"
done

$ ./for10.sh
Number 1: 10
Number 2: 15
Number 3: 20
Number 4: 25
Number 5: 30

11. Plage de nombres après le mot clé "in"

Vous pouvez effectuer une boucle en utilisant une plage de nombres dans la boucle for "in" en utilisant l'expansion des accolades.

L'exemple suivant effectue une boucle 10 fois en utilisant les valeurs 1 à 10.

$ cat for11.sh
for num in {1..10}
do
 echo "Number: $num"
done

$ ./for11.sh
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
...

12. Plage de nombres avec incréments après le mot-clé "in"

L'exemple suivant boucle 5 fois en utilisant les valeurs 1 à 10, avec un incrément de 2. C'est-à-dire qu'il commence par 1 et continue d'incrémenter de 2, jusqu'à ce qu'il atteigne 10.

$ cat for12.sh
for num in {1..10..2}
do
 echo "Number: $num"
done

$ ./for12.sh
Number: 1
Number: 3
Number: 5
Number: 7
Number: 9

PS : N'oubliez pas de mettre cet article en signet pour votre future référence.


Linux
  1. Bash For Loop Guide et exemples

  2. 5 meilleures extensions GNOME Shell pour votre bureau Linux

  3. Exemples de boucle Bash For et de boucle While

  4. Vous tenir au courant - Exemples de boucle Bash For, While, Until

  5. Bash for loop Exemples

Bash For Loops avec des exemples

Shell Scripting pour les débutants - Comment écrire des scripts Bash sous Linux

Bash For Loop – Le guide le plus pratique

Bash Shell PS1 :10 exemples pour rendre votre invite Linux comme Angelina Jolie

Tutoriel d'introduction aux scripts Bash avec 5 exemples pratiques

Script bash pour la boucle expliqué avec des exemples