FRFAM.COM >> Famille >> Technologie &Innovation >> Informatique

Maîtriser les boucles for en Bash sous Linux : Guide complet et pratique

Les scripts Bash sont un outil puissant pour automatiser les tâches sous Linux, en exploitant d'autres programmes existants. La boucle for est idéale pour répéter une opération similaire plusieurs fois.

Les administrateurs système Linux et macOS maîtrisent généralement les scripts via le terminal. Les utilisateurs Windows peuvent aussi s'y initier grâce au sous-système Windows pour Linux (WSL).

Fonctionnement des scripts Bash

Un script Bash est un fichier texte contenant des commandes exécutables par le shell Bash, shell par défaut sur la plupart des distributions Linux et macOS (pré-Catalina).

Pour débuter, créez un script simple. Ouvrez un terminal, accédez au répertoire désiré et créez le fichier suivant :

#!/bin/bash
echo "Hello, World"

La première ligne (shebang) indique l'interpréteur Bash. Enregistrez sous hello_world.sh, puis :

chmod +x hello_world.sh
./hello_world.sh

La commande chmod +x rend le fichier exécutable. Si "Hello, World" s'affiche, tout est en ordre.

Comment fonctionnent les boucles for

En programmation, les boucles for sont de deux types principaux : numériques (sur un compteur) et itératives (sur une liste ou un tableau).

Exemple numérique classique (syntaxe C-like) :

for (i = 0; i < 100; i++) {
  /* instructions répétées */
}

Exemple itératif (foreach-like) :

personnes = ["Pierre", "Paul", "Marie"]
for personne in personnes:
    if personne == "Paul":
        ...

Boucles for...in en Bash

En Bash, la boucle for...in est la plus courante. Syntaxe :

for arg in [liste]; do
  # instructions
  # $arg contient la valeur courante
done

Exemple sur trois fichiers :

for fichier in un.c deux.c trois.c; do
  ls "$fichier"
done

Sortie :

un.c
deux.c
trois.c

Avec un glob (modèle avec wildcards) pour tous les fichiers .xml :

for fichier in *.xml; do
  ls -l "$fichier"
done

Exemple de sortie :

-rw-r--r-- 1 user staff 2436 3 nov. 2019 feed.xml
-rw-r--r-- 1 user staff 6447 27 oct. 16:24 sitemap.xml

Contrairement à ls -l *.xml (une exécution), la boucle lance ls une fois par fichier.

Avec wc -l :

wc -l *.xml

Donne totaux ; en boucle :

for fichier in *.xml; do
  wc -l "$fichier"
done

Affiche par fichier sans total global.

Quand une liste n'est pas traitée comme telle

Évitez les guillemets autour de la liste :

for fichier in un.c deux.c; do ... done

Pas :

for fichier in "un.c deux.c"; do ... done  # Une seule itération

Utilisez une variable :

FILES="un.c deux.c"
for fichier in $FILES; do ... done

For sans liste explicite

Sans liste, itère sur les arguments de ligne de commande ($@) :

#!/bin/bash
for a; do
  echo $a
done

./args.sh un deux trois affiche :

un
deux
trois

Boucle for numérique traditionnelle

Syntaxe C-like :

for ((i=1; i<=5; i++)); do
  echo $i
done

Ou avec expansion d'accolades (plus concise) :

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

Contrôle fin avec break et continue

Exemple : trouver le premier fichier >100 caractères :

#!/bin/bash
for fichier in *; do
  if [ ! -f "$fichier" ]; then
    echo "$fichier n'est pas un fichier"
    continue
  fi
  num_chars=$(wc -c <"$fichier")
  echo "$fichier contient $num_chars caractères"
  if [ $num_chars -gt 100 ]; then
    echo "Fichier >100 trouvé : $fichier"
    break
  fi
done

Conclusion

Les scripts Bash automatisent efficacement les tâches. Les boucles for, combinées à des variables, commandes externes, break et continue, permettent une logique complexe pour de nombreuses opérations système.

[]