Boucles avec for et while

ShellBeginner
Pratiquer maintenant

Introduction

Imaginez que vous devez signer 1 000 lettres. En signer une est facile. En signer 1 000 est monotone et vous fait mal à la main. En programmation, nous détestons les répétitions fastidieuses.

Pour résoudre ce problème, nous utilisons des boucles. Une boucle permet de dire à l’ordinateur : effectue cette action de manière répétée, soit pour chaque élément d’une liste, soit jusqu’à ce qu’une condition change.

Les boucles sont essentielles à l’automatisation, car les ordinateurs sont doués pour répéter une action et les humains beaucoup moins. Si vous vous surprenez à exécuter plusieurs fois la même suite de commandes, c’est souvent le signe qu’une boucle serait utile.

Dans ce laboratoire, vous allez construire vos propres chaînes d’assemblage numériques :

  1. Le compteur : une boucle qui compte à votre place (la boucle for).
  2. L’opérateur : une boucle qui traite chaque fichier d’un ensemble (la boucle for avec des fichiers).
  3. Le surveillant : une boucle qui continue à travailler jusqu’à ce qu’un objectif soit atteint (la boucle while).

La boucle sur les nombres (boucle for)

La boucle for fonctionne comme une liste de contrôle. Vous disposez d’une liste d’éléments et vous effectuez une action pour chaque élément de cette liste.

Il s’agit de l’un des modèles d’automatisation les plus utiles dans les systèmes de type Unix. Les ordinateurs sont très efficaces pour répéter une petite action de manière régulière. Les boucles permettent donc de passer d’une tâche portant sur un seul élément à une tâche portant sur de nombreux éléments, sans recopier la même commande encore et encore.

Commençons par la liste la plus simple : des nombres. Nous allons demander à l’ordinateur de compter de 1 à 5.

Commencez par vérifier votre espace de travail :

cd ~/project

Créez un script nommé num_loop.sh :

nano num_loop.sh

Saisissez ce code :

#!/bin/bash

for i in {1..5}; do
  echo "Number: $i"
done

Décomposition de la chaîne d’assemblage :

  • for i in {1..5} : c’est le dispositif d’alimentation de la machine. Il prend les nombres 1, 2, 3, 4 et 5, puis les place l’un après l’autre dans la variable $i.
  • do : démarre la machine.
  • echo ... : indique l’action à effectuer.
  • done : termine le traitement de l’élément actuel, puis revient chercher le suivant.

La partie {1..5} est une notation abrégée de Bash appelée expansion d’accolades. Avant le démarrage de la boucle, Bash la transforme en une liste de valeurs. La boucle parcourt donc une liste préparée, un élément à la fois.

Enregistrez le fichier (Ctrl+O), puis quittez (Ctrl+X).

Rendez le script exécutable, puis lancez-le :

chmod +x num_loop.sh
./num_loop.sh

Vous verrez le robot compter :

Number: 1
Number: 2
Number: 3
Number: 4
Number: 5

La boucle sur les fichiers (boucle for)

Compter est amusant, mais traiter des fichiers est utile. La boucle for est particulièrement puissante lorsqu’elle est associée à des caractères génériques, comme *.txt. Vous pouvez dire au script : « Pour chaque fichier texte trouvé dans ce dossier, effectue telle action. »

Nous avons déjà créé des fichiers texte d’exemple dans votre dossier. Écrivons un script pour les trouver.

Créez un nouveau fichier nommé file_loop.sh :

nano file_loop.sh

Saisissez ce code :

#!/bin/bash

echo "Listing text files:"
for file in *.txt; do
  echo "Found file: $file"
done

La logique :

Au lieu des nombres {1..5}, nous fournissons à la boucle le motif *.txt.

BASH examine le dossier, trouve tous les fichiers correspondants, comme data1.txt et notes.txt, puis les place l’un après l’autre dans la variable appelée $file.

Cette correspondance a lieu avant l’exécution du corps de la boucle. Le shell développe *.txt en une liste de noms de fichiers, puis la boucle for parcourt cette liste. C’est pourquoi les boucles et les motifs glob fonctionnent si bien ensemble dans les scripts shell.

Enregistrez le fichier, puis quittez.

Exécutez le script :

chmod +x file_loop.sh
./file_loop.sh

Sortie attendue :

Listing text files:
Found file: data1.txt
Found file: data2.txt
Found file: notes.txt

Imaginez que, plutôt que d’utiliser simplement echo, vous utilisiez mv pour déplacer ces fichiers ou zip pour les archiver. Vous pourriez traiter 10 000 fichiers en quelques secondes avec ce même script de 4 lignes !

La boucle conditionnelle (boucle while)

La boucle for est idéale lorsque vous disposez d’une liste, par exemple une liste de nombres ou de fichiers. Mais que faire si vous n’avez pas de liste ? Que faire si vous voulez simplement « continuer à travailler JUSQU’À ce qu’un événement se produise » ?

C’est le rôle de la boucle while. Elle fonctionne comme un thermostat : « Tant que la pièce est froide, laisse le chauffage allumé. »

Écrivons un script qui compte manuellement jusqu’à 10.

Créez while_loop.sh :

nano while_loop.sh

Saisissez ce code :

#!/bin/bash

counter=1

while [ $counter -le 10 ]; do
  echo "Count: $counter"
  ((counter++))
done

Décomposition du thermostat :

  • while [ $counter -le 10 ] : la condition. « Le compteur est-il inférieur ou égal à 10 ? »
    • Si OUI : entrez dans la boucle.
    • Si NON : arrêtez-vous.
  • ((counter++)) : la mise à jour. Cette instruction ajoute 1 au compteur. Point essentiel : si vous oubliez cette ligne, le compteur reste indéfiniment à 1 et le script s’exécute sans fin : c’est une « boucle infinie » !

Cela met en évidence la différence essentielle entre for et while. Une boucle for reçoit généralement sa séquence du shell dès le départ. Une boucle while dépend d’une condition que votre script doit mettre à jour correctement pendant son exécution.

La syntaxe ((counter++)) est une notation arithmétique de Bash. Elle indique au shell de traiter counter comme un nombre et de l’augmenter de 1. Les scripts shell combinent souvent le traitement de texte et des opérations arithmétiques simples ; cette syntaxe apparaît donc fréquemment.

Enregistrez le fichier, puis quittez.

Exécutez le script :

chmod +x while_loop.sh
./while_loop.sh

Le comportement ressemble à celui de la boucle for, mais la logique est différente. For parcourt une liste. While s’exécute tant qu’une condition est vraie.

Résumé

Vous avez construit vos premiers moteurs d’automatisation.

Dans ce laboratoire, vous avez maîtrisé :

  1. La liste de contrôle (for) : traiter une liste définie d’éléments, comme les nombres {1..5}.
  2. Le traitement par lots (for *.txt) : traiter automatiquement chaque fichier d’un répertoire.
  3. Le thermostat (while) : répéter des actions jusqu’à ce qu’un objectif ou une limite précise soit atteint.

Ces boucles sont les éléments essentiels des scripts. Elles transforment 1 000 clics manuels en 1 seconde de travail informatique.