Boucler les lignes d’un fichier : Bash For Loop expliqué

Je veux boucler les lignes d’un fichier avec un script Bash et l’une des façons de le faire est d’utiliser une boucle for.

Qu’est-ce qu’une boucle for ?

Une boucle for est l’une des constructions de programmation les plus courantes et elle est utilisée pour exécuter un bloc de code donné en fonction d’un ensemble d’éléments dans une liste. Par exemple, disons que vous voulez écrire un programme qui imprime le nombre de personnes qui vivent dans les 10 plus grandes villes européennes. Le programme peut utiliser une boucle for pour parcourir chaque ville de la liste et imprimer le nombre de personnes pour cette ville.

La logique exécutée est à chaque fois la même et la seule chose qui change est la ville.

Vous pouvez voir ci-dessous la syntaxe générique d’une boucle for de Bash:

for item in do command1 command2 ... commandNdone

La liste peut être, par exemple:

  • une plage de nombres.
  • une séquence de chaînes de caractères séparées par des espaces.
  • la sortie d’une commande Linux (par exemple, la commande ls).

Les N commandes entre do et done sont exécutées pour chaque élément de la liste.

La boucle for en Bash

Dans cet article, vous apprendrez à utiliser la boucle for en Bash et plus particulièrement à parcourir les lignes d’un fichier.

Mais pourquoi faire cela ? Parcourir les lignes d’un fichier ?

Par exemple, vous pourriez avoir besoin de le faire si vous avez exporté des données d’une application dans un fichier et que vous voulez élaborer ces données d’une manière ou d’une autre.

Dans cet exemple, nous utiliserons un simple fichier .txt dans lequel chaque ligne contient :

  • le nom d’une ville
  • le nombre de personnes qui vivent dans cette ville.

Vous pouvez voir ci-dessous le format du fichier texte, un deux-points est utilisé pour séparer chaque ville du nombre de personnes qui vivent dans cette ville :

Istanbul:15,067,724Moscow:12,615,279London:9,126,366... 

Alors, comment pouvons-nous utiliser une boucle for de Bash pour parcourir le contenu de ce fichier ?

D’abord, nous allons stocker le nom du fichier dans une variable

FILENAME="european-cities.txt"

Après cela, nous utiliserons une autre variable et la commande cat pour obtenir toutes les lignes du fichier :

LINES=$(cat $FILENAME)

Ici, nous utilisons la substitution de commande pour affecter la sortie de la commande cat aux variables LINES.

Enfin, la boucle for permet de parcourir chaque ligne du fichier:

for LINE in $LINESdo echo "$LINE"done

Do et done sont utilisés pour définir les commandes à exécuter à chaque itération de la boucle for.

Par exemple, si vous avez un fichier de 10 lignes, la boucle for passera par 10 itérations et à chaque itération, elle lira une ligne du fichier.

La commande echo peut être remplacée par n’importe quelle séquence de commandes en fonction de ce que vous voulez faire avec chaque ligne du fichier.

Voici le script final :

#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)for LINE in $LINESdo echo "$LINE"done

Et la sortie du script est…

./cities.sh Istanbul:15,067,724Moscow:12,615,279London:9,126,366Saint-Petersburg:5,383,890Berlin:3,748,148Kyiv:3,703,100Madrid:3,223,334Rome:2,857,321Paris:2,140,526Bucharest:2,106,144

Nous passons la liste à la boucle for en utilisant la commande cat.

Cela signifie que nous pouvons utiliser toutes les commandes que nous voulons pour générer la LISTE à passer à la boucle for.

Avez-vous en tête d’autres commandes possibles ?

De plus, la boucle for n’est pas la seule option pour créer une boucle dans un script Bash, une autre option est une boucle while.

Qu’est-ce qu’un compteur dans une boucle for de Bash ?

Dans une boucle for, vous pouvez également définir une variable appelée compteur. Vous pouvez utiliser un compteur pour suivre chaque itération de la boucle.

L’utilisation d’un compteur est très courante dans tous les langages de programmation. Il peut également être utilisé pour accéder aux éléments d’une structure de données à l’intérieur de la boucle (ce n’est pas le cas pour notre exemple).

Modifions le programme précédent et définissons un compteur dont la valeur est imprimée à chaque itération :

#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)COUNTER=0for LINE in $LINESdo echo "Counter $COUNTER: $LINE" COUNTER=$((COUNTER+1))done

Comme vous pouvez le voir, j’ai défini une variable appelée COUNTER à l’extérieur de la boucle for avec sa valeur initiale fixée à 0.

Puis à chaque itération j’imprime la valeur du compteur ainsi que la ligne du fichier.

Après avoir fait cela j’utilise l’opérateur arithmétique de Bash pour augmenter la valeur de la variable COUNTER de 1.

Et voici la sortie du script:

Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366Counter 3: Saint-Petersburg:5,383,890Counter 4: Berlin:3,748,148Counter 5: Kyiv:3,703,100Counter 6: Madrid:3,223,334Counter 7: Rome:2,857,321Counter 8: Paris:2,140,526Counter 9: Bucharest:2,106,144

Break and Continue in a Bash For Loop

Il existe des moyens de modifier le déroulement normal d’une boucle for en Bash.

Les deux instructions qui permettent de le faire sont break et continue:

  • break : interrompt l’exécution de la boucle for et saute à la première ligne après for loop.
  • continue : saute à l’itération suivante de la boucle for.

Avoir défini un compteur nous aide à voir ce qui se passe lorsque nous ajoutons break ou continue à notre script existant.

Débutons avec break…

Je vais ajouter une instruction if basée sur la valeur du compteur. L’instruction break à l’intérieur du if interrompt l’exécution de la boucle si le compteur est égal à 3:

#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)COUNTER=0for LINE in $LINESdo if ; then break fi echo "Counter $COUNTER: $LINE" COUNTER=$((COUNTER+1))done

Et la sortie est:

Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366

Comme vous pouvez le voir l’instruction break arrête l’exécution de la boucle for avant d’atteindre la commande echo parce que COUNTER est 3.

Après cela, remplaçons break par continue et voyons ce qui se passe. Je laisserai le reste du code inchangé.

#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)COUNTER=0for LINE in $LINESdo if ; then continue fi echo "Counter $COUNTER: $LINE" COUNTER=$((COUNTER+1))done

Et voici la sortie du script:

Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366

Bizarre…la sortie est la même. Pourquoi ?

C’est parce que lorsque la valeur du COMPTEUR est 3, l’instruction continue saute à l’itération suivante de la boucle mais elle n’incrémente pas la valeur du compteur.

Donc à l’itération suivante, la valeur du COMPTEUR est toujours 3 et l’instruction continue est exécutée à nouveau, et ainsi de suite pour toutes les autres itérations.

Pour corriger cela, nous devons augmenter la valeur de la variable COMPTEUR à l’intérieur de l’instruction if :

#!/bin/bash FILENAME="european-cities.txt"LINES=$(cat $FILENAME)COUNTER=0for LINE in $LINESdo if ; then COUNTER=$((COUNTER+1)) continue fi echo "Counter $COUNTER: $LINE" COUNTER=$((COUNTER+1))done

Cette fois, nous voyons la sortie correcte :

Counter 0: Istanbul:15,067,724Counter 1: Moscow:12,615,279Counter 2: London:9,126,366Counter 4: Berlin:3,748,148Counter 5: Kyiv:3,703,100Counter 6: Madrid:3,223,334Counter 7: Rome:2,857,321Counter 8: Paris:2,140,526Counter 9: Bucharest:2,106,144

Comme vous pouvez le voir « Compteur 3 : …. » n’est pas imprimé dans le terminal.

Écrire une boucle for en une ligne

Avant de terminer ce tutoriel, voyons comment nous pouvons écrire une boucle for en une ligne.

Ce n’est pas une pratique suggérée considérant que cela rend votre code moins lisible.

Mais il est bon de savoir comment écrire une boucle en une ligne, cela donne plus de profondeur à votre connaissance de Bash.

La syntaxe générique d’une boucle for Bash en une ligne est la suivante :

for i in ; do ; done

Imprimons le contenu de notre fichier texte avec une boucle for en une ligne :

#!/bin/bashFILENAME="european-cities.txt"LINES=$(cat $FILENAME)for LINE in $LINES; do echo $LINE; done

Pour simplifier les choses, j’ai supprimé le COMPTEUR et l’instruction if. Si elles étaient là, la boucle for d’une ligne serait beaucoup plus difficile à lire.

Essayez de rester à l’écart des lignes uniques si elles rendent votre code difficile à lire.

Conclusion

En conclusion, dans ce tutoriel, vous avez appris à :

  1. Stocker les lignes d’un fichier dans une variable
  2. Utiliser une boucle for pour parcourir chaque ligne.
  3. Utiliser un compteur dans une boucle for.
  4. Changer le flux d’une boucle avec break et continue.
  5. Ecrire une boucle for en une ligne.

C’est logique ?

Comment allez-vous utiliser cela ?

Mettez-moi au courant 🙂

Si vous voulez en savoir plus sur les boucles dans le scriptage Bash, jetez un coup d’œil à ce tutoriel.

Cours GRATUIT associé : Décrypter le scriptage Bash

.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée.