9 exemples de boucles for dans les scripts Linux Bash

9 exemples de boucles for dans les scripts Linux Bash

Points clés à retenir

  • La boucle Bash for est un outil polyvalent qui peut fonctionner avec des nombres, des mots, des tableaux, des variables de ligne de commande ou la sortie d’autres commandes.
  • Les boucles for simples peuvent être utilisées avec des listes numériques ou des listes de mots, vous permettant de répéter une section de code pour chaque valeur de la liste.
  • La boucle for peut également être utilisée avec des plages de numéros, des noms de fichiers, des paramètres de ligne de commande, des tableaux de mots et des tableaux associatifs, offrant ainsi une flexibilité dans les tâches de script.

La forboucle Bash polyvalente fait bien plus que boucler un nombre de fois défini. Nous décrivons ses nombreuses variantes afin que vous puissiez les utiliser avec succès dans vos propres scripts Linux.

La boucle for

Tous les langages de script et de programmation disposent d’un moyen de gérer les boucles. Une boucle est une section de code que vous souhaitez exécuter à plusieurs reprises. Plutôt que de taper encore et encore le même ensemble d’instructions dans votre script , une boucle répétera une section de code encore et encore pour vous.

La boucle Bash forest très flexible. Il peut fonctionner avec des nombres, des mots, des tableaux, des variables de ligne de commande ou le résultat d’autres commandes. Ceux-ci sont utilisés dans l’en-tête de la boucle. L’en-tête indique avec quoi la boucle fonctionne (des nombres ou des chaînes, par exemple) et quelle est la condition de fin qui arrêtera la boucle.

Le corps de la boucle contient le code que vous souhaitez répéter. Il contient ce que vous voulez que la boucle fasse. Le corps de la boucle peut contenir n’importe quelle commande de script valide.

Une variable appelée compteur de boucles ou itérateur est utilisée pour parcourir une plage de valeurs ou une liste d’éléments de données. Pour chaque boucle, l’itérateur prend la valeur du nombre, de la chaîne ou du type de données suivant sur lequel la boucle itère. Cela permet à la boucle de travailler tour à tour avec les valeurs de chacun des éléments de données, ou même dans certains cas de manipuler les éléments de données eux-mêmes.

Simple pour les boucles

Si vous souhaitez écrire votre première boucle for, ces exemples simples vous aideront à démarrer.

pour les boucles utilisant des listes numériques

Vous pouvez exécuter une forboucle sur la ligne de commande. Cette commande crée et exécute une forboucle simple. L’itérateur est une variable appelée i. Nous allons attribuer itour à tour chacune des valeurs de la liste de nombres. Le corps de la boucle va imprimer cette valeur dans la fenêtre du terminal. La condition qui termine cette boucle est le moment où ia parcouru toute la liste de nombres.

for i in 1 2 3 4 5; do echo $i; done

une boucle for comptant de 1 à 5

Il est important de noter ici que la variable iest augmentée de un à chaque fois que la boucle tourne, mais c’est parce que la liste des nombres augmente de un à chaque fois.

Cette liste de nombres commence à 3 et monte par pas de deux, puis saute arbitrairement jusqu’à 44.

for i in 3 5 7 9 11 44; do echo $i; done

une boucle for comptant à travers une liste de nombres non séquentielle

Cela ne change rien à la forboucle. Il commence à une extrémité de la liste et utilise chaque valeur tour à tour, jusqu’à ce que toutes les valeurs de la liste aient été utilisées.

Il n’est pas non plus nécessaire que les nombres soient classés par ordre croissant. Ils peuvent être dans n’importe quel ordre.

for i in 3 43 44 11 9; do echo $i; done

une boucle for comptant à travers une liste de nombres non triés

pour les boucles utilisant des listes de mots

Nous pouvons tout aussi bien faire la même chose avec les mots. Copiez le texte du script dans un éditeur et enregistrez-le sous « word-list.sh ».

#!/bin/bashfor word in This is a sequence of wordsdo echo $worddone

Vous devrez utiliser chmodpour rendre le script exécutable, ainsi que tout autre script que vous copiez à partir de cet article. Remplacez simplement le nom du script chaque fois que vous utilisez la chmodcommande.

chmod +x word-list.sh

Rendre un script exécutable avec chmod

Exécutons le script.

./word-list.sh

Une boucle for travaillant sur une liste de mots

Tout comme il l’a fait avec les nombres, l’itérateur (dans cet exemple, la variable) wordparcourt la liste des éléments de données jusqu’à atteindre la fin de la liste. Le corps de la boucle accède à la valeur de la wordvariable et ainsi chaque mot de la liste est traité.

pour les boucles avec des plages de numéros

Si vous vouliez qu’une forboucle s’exécute 100 fois, ce serait une affaire assez fastidieuse de devoir taper une séquence de 100 nombres dans l’en-tête de la boucle. Les plages de numéros vous permettent de spécifier uniquement le premier et le dernier numéro.

Ce script est « number-range.sh ».

#!/bin/bashfor i in {1..10}do echo "Loop spin:" $idone

La plage de numéros est définie entre accolades  » {} » avec deux points  » .. » séparant les nombres qui commencent et terminent la plage. Assurez-vous de ne pas inclure d’espaces dans la définition de la plage.

Voici comment cela fonctionne :

./number-range.sh

Une boucle for utilisant une plage de numéros

Vous pouvez inclure un autre nombre qui définit la taille de pas que l’itérateur doit utiliser pour parcourir les nombres de la plage. Ce script, « number-range2.sh », utilisera une plage de 0 à 32 et une taille de pas de 4.

#!/bin/bashfor i in {0..32..4}do echo "Loop spin:" $idone

L’itérateur parcourt la plage de nombres par sauts de quatre.

./number-range2.sh

Une boucle for utilisant un pas d'itérateur de 4

pour les boucles utilisant des noms de fichiers

Parce que nous pouvons traiter des listes de mots, nous pouvons faire fonctionner nos scripts avec des noms de fichiers. Ce script s’appelle « filenames.sh ».

#!/bin/bashfor file in word-list.sh number-range.sh number-range2.sh filenames.shdo ls -lh "$file"done

Il serait plutôt inutile d’avoir un script qui ne fait que ce qui lspeut faire, mais il montre comment accéder aux noms de fichiers à l’intérieur du corps de la boucle.

./filenames.sh

Une boucle for utilisant une liste de noms de fichiers

De la même manière que pour l’utilisation de la plage de numéros, nous pouvons utiliser un modèle de fichier dans l’en-tête de la boucle pour spécifier les fichiers que nous souhaitons traiter. Cela évite beaucoup de saisie et signifie que nous n’avons pas besoin de connaître à l’avance les noms des fichiers.

Ce script s’appelle « filenames2.sh ». Nous avons remplacé la liste des noms de fichiers par le modèle de nom de fichier « *.sh » pour que le script rende compte de tous les fichiers de script du répertoire actuel.

#!/bin/bashfor file in *.shdo ls -lh "$file"done

Voici le résultat.

./filenames2.sh

Une boucle for utilisant un modèle de fichier *.sh

pour les boucles utilisant les paramètres de ligne de commande

Nous pouvons ajouter un peu plus de flexibilité en transmettant le modèle de nom de fichier sur la ligne de commande. La $*variable représente tous les paramètres de ligne de commande transmis au script.

Il s’agit de « noms de fichiers3.sh ».

#!/bin/bashfor file in $*do ls -lh "$file"done

Nous demanderons des noms de fichiers commençant par « n » et ayant une extension SH.

./filenames3.sh n*.sh

Une boucle for prenant un modèle de fichier comme paramètre de ligne de commande

Nous pouvons également transmettre plusieurs modèles à la fois.

./filenames3.sh n*.sh. bashrc

Une boucle for prenant un modèle de fichier et les paramètres de ligne de commande d'un nom de fichier

La variable itérateur fileprend la valeur de chacun des paramètres de ligne de commande. Les modèles de noms de fichiers sont développés et tous les noms de fichiers sont traités dans le corps de la boucle.

C-like pour les boucles

Bash prend en charge la boucle for classique à trois termes, comme celles trouvées dans le langage de programmation C. On les appelle boucles for à trois termes car il y a trois termes dans l’en-tête de la boucle.

  • La valeur initiale de l’itérateur de boucle.
  • Le test pour savoir si la boucle continue ou se termine.
  • L’incrémentation (ou la décrémentation) de l’itérateur.

Ce script est « c-like.sh ».

L’itérateur Iest défini sur 1 au début de la boucle et la boucle s’exécutera aussi longtemps que l’instruction «i<=10 » est vraie. Dès qu’il iatteint 11, la forboucle s’arrêtera. L’itérateur est augmenté de un à chaque tour de la boucle.

#!/bin/bashfor ((i=1; i<=10; i++))do echo "Loop number:" $idone

Exécutons ce script.

./c-like.sh

Une boucle for à trois termes ou de type C

La boucle de type C forpermet de créer facilement des forboucles ayant des exigences légèrement étranges. Cette boucle commence à 15 et compte à rebours par pas de 3. Il s’agit de « c-like2.sh »

#!/bin/bashfor ((i=15; i>0; i-=3))do echo "Loop number:" $idone

Lorsque nous l’exécutons, il devrait reculer par étapes de trois.

./c-like2.sh

Une boucle for de type C qui compte à rebours

Infini pour les boucles

Vous pouvez également utiliser ce format de forboucle pour créer une boucle infinie. Tout ce que vous avez à faire est de supprimer tous les éléments de l’en-tête de la boucle, comme ceci. C’est « infinite.sh ».

#!/bin/bashfor ((; ;))do echo "Press Ctrl+C to stop..." sleep 1done

Vous devrez appuyer sur Ctrl+C pour arrêter la boucle.

./infinite.sh

Une boucle for infinie de type C

pour les boucles utilisant des tableaux de mots

Nous pouvons facilement parcourir un éventail de mots. Nous devons fournir le nom du tableau dans l’en-tête de la boucle, et l’itérateur parcourra toutes les entrées du tableau. Il s’agit de « word-array.sh ».

#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo echo $distrodone

Toutes les distributions sont répertoriées pour nous.

./word-array.sh

Une boucle for utilisant un tableau de mots

La commande continuer

Si vous souhaitez que la boucle franchisse une entrée particulière, testez si l’itérateur correspond à cette entrée et utilisez la continuecommande. La continuecommande abandonne la rotation actuelle de la boucle. Il incrémente l’itérateur et démarre la prochaine rotation de la boucle, en supposant que l’entrée que vous souhaitez ignorer n’est pas le dernier élément de la liste.

Il s’agit de « word-array2.sh ». Il enjambe l’entrée du tableau « Arch » mais traite tous les autres membres du tableau.

#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then continue fi echo $distrodone

« Arch » n’apparaît pas dans la fenêtre du terminal.

./word-array2.sh

Une boucle for sautant une entrée dans un tableau de mots à cause de la commande continue

La commande break

La breakcommande sort de la boucle et empêche tout traitement ultérieur.

Il s’agit de « word-array3.sh ». C’est le même que le script précédent continueremplacé par break.

#!/bin/bashdistributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")for distro in $distributionsdo if [[ "$distro" == "Arch" ]] ; then break fi echo $distrodone

Lorsque l’itérateur contient « Arch », la boucle for abandonne tout traitement supplémentaire.

./word-array3.sh


Une boucle for abandonne le traitement ultérieur à cause de la commande break

pour les boucles utilisant des tableaux associatifs

Dans Bash 4 et versions ultérieures, les tableaux associatifs vous permettent de créer des listes de paires clé-valeur qui peuvent être recherchées par la clé ou par la valeur. En raison de la relation bidirectionnelle entre la clé et la valeur, ils sont également appelés dictionnaires de données.

Nous pouvons parcourir un tableau associatif à l’aide d’une forboucle. Ce script s’appelle « associative.sh ». Il définit un tableau associatif contenant quatre entrées, une pour chacun de « chien », « chat », « rouge-gorge » et « humain ». Ce sont les clés. Les valeurs sont le nombre (par défaut) de jambes dont chacun dispose.

#!/bin/bashdeclare -A animals=([dog]=Four-legged [cat]=Four-legged [robin]=Two-legged [human]=Two-legged)for legs in ${!animals[@]}do if [ ${animals[$legs]} == "Two-legged" ]; then echo ${legs} fidone

L’itérateur s’appelle legs. Notez que l’en-tête de la boucle contient un !point d’exclamation « ». Cela n’agit pas comme un opérateur NOT logique, cela fait partie de la syntaxe du tableau associatif. Il est nécessaire de rechercher dans le tableau.

Le corps de la boucle effectue un test de comparaison de chaînes. Si la valeur du membre du tableau est « à deux pattes », il imprime la valeur de la clé dans la fenêtre du terminal. Lorsque nous l’exécutons, le script imprime les créatures à deux pattes.

./associative.sh


Utiliser une boucle for pour extraire des éléments d'un tableau associatif

Itération sur la sortie des commandes

Si vous disposez d’une commande ou d’une séquence de commandes qui produit une liste de quelque chose, comme des noms de fichiers, vous pouvez les parcourir avec une forboucle. Vous devez faire attention aux extensions inattendues du nom de fichier, mais dans les cas simples, tout va bien.

Ce script s’appelle « command.sh ». Il utilise lset wcpour fournir une liste triée de noms de fichiers de script, ainsi que leur nombre de lignes, de mots et d’octets.

#!/bin/bashfor i in $(ls *.sh | sort);do echo $(wc $i)done

Lorsque nous l’exécutons, nous obtenons les statistiques de chaque fichier, les fichiers étant classés par ordre alphabétique.

./command.sh

Utiliser une boucle for pour parcourir la sortie de deux commandes redirigées

L’éblouissant pour la boucle

La forboucle est un outil de script polyvalent et facile à comprendre. Mais aussi flexible soit-il, n’oubliez pas que d’autres boucles existent pour une raison. Ne soyez pas ébloui en pensant que la forboucle est tout ce dont vous aurez besoin.

La whileboucle, par exemple, est bien mieux adaptée à certaines choses que la forboucle, comme la lecture de lignes à partir d’un fichier .

Écrire de bons scripts signifie utiliser l’outil le plus adapté à la tâche à accomplir. La forboucle est un excellent outil à avoir dans votre boîte à outils d’astuces.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *