Aller au contenu principal

Boucles


Table des matières

  1. Boucle for
  2. Boucle while
  3. Boucle until
  4. Contrôle de flux : break et continue
  5. Lecture de fichiers
  6. Exercices pratiques


1 - Boucle for

Syntaxe de base

for variable in liste; do
# commandes
done

Itération sur une liste

# Liste explicite
for fruit in pomme banane orange; do
echo "Fruit: $fruit"
done

# Avec tableau
fruits=("pomme" "banane" "orange")
for fruit in "${fruits[@]}"; do
echo "Fruit: $fruit"
done

Expansion de séquence

# Avec {start..end}
for i in {1..5}; do
echo "Numéro: $i"
done

# Avec incrément
for i in {0..10..2}; do
echo "Pair: $i" # 0, 2, 4, 6, 8, 10
done

# Avec seq (plus ancien)
for i in $(seq 1 5); do
echo "$i"
done

Boucle for style C

# Syntaxe (( ))
for ((i=0; i<5; i++)); do
echo "Index: $i"
done

# Avec plusieurs variables
for ((i=0, j=10; i<5; i++, j--)); do
echo "i=$i, j=$j"
done

Itération sur fichiers

# Tous les fichiers .txt
for file in *.txt; do
echo "Fichier: $file"
done

# Fichiers dans un répertoire
for file in /var/log/*; do
if [ -f "$file" ]; then
echo "Fichier: $file"
fi
done

# Avec find (plus robuste)
while IFS= read -r -d '' file; do
echo "Fichier: $file"
done < <(find /var/log -name "*.log" -print0)

Itération sur lignes d'une commande

# Résultat d'une commande
for user in $(cut -d: -f1 /etc/passwd); do
echo "Utilisateur: $user"
done

# Attention aux espaces !
# Utiliser while read pour les lignes avec espaces

🔝 Retour à la table des matières



2 - Boucle while

Syntaxe

while [ condition ]; do
# commandes
done

Exemples

# Compteur
count=0
while [ $count -lt 5 ]; do
echo "Count: $count"
((count++))
done

# Avec [[ ]]
i=0
while [[ $i -lt 10 ]]; do
echo $i
((i++))
done

# Boucle infinie
while true; do
echo "Appuyez Ctrl+C pour arrêter"
sleep 1
done

Attendre une condition

# Attendre qu'un fichier existe
while [ ! -f /tmp/ready ]; do
echo "En attente..."
sleep 1
done
echo "Fichier trouvé!"

# Attendre qu'un service réponde
while ! curl -s http://localhost:8080/health > /dev/null; do
echo "Service non disponible, attente..."
sleep 5
done
echo "Service UP!"
#!/bin/bash

while true; do
echo ""
echo "=== Menu ==="
echo "1. Option 1"
echo "2. Option 2"
echo "q. Quitter"
read -p "Choix: " choice

case $choice in
1) echo "Option 1 sélectionnée" ;;
2) echo "Option 2 sélectionnée" ;;
q|Q) echo "Au revoir!"; break ;;
*) echo "Choix invalide" ;;
esac
done

🔝 Retour à la table des matières



3 - Boucle until

Syntaxe

until [ condition ]; do
# commandes (tant que condition est FAUSSE)
done

until est l'inverse de while : exécute tant que la condition est fausse.

Exemples

# Compteur
count=0
until [ $count -ge 5 ]; do
echo "Count: $count"
((count++))
done

# Attendre qu'un service soit disponible
until curl -s http://localhost:8080 > /dev/null 2>&1; do
echo "En attente du service..."
sleep 2
done
echo "Service disponible!"

Comparaison while vs until

# Ces deux boucles sont équivalentes:

# while
while [ $x -lt 10 ]; do
echo $x
((x++))
done

# until
until [ $x -ge 10 ]; do
echo $x
((x++))
done

🔝 Retour à la table des matières



4 - Contrôle de flux : break et continue

break - Sortir de la boucle

# Sortir au premier fichier vide
for file in *.txt; do
if [ ! -s "$file" ]; then
echo "Fichier vide trouvé: $file"
break
fi
done

# break N - sortir de N niveaux
for i in {1..3}; do
for j in {1..3}; do
if [ $i -eq 2 ] && [ $j -eq 2 ]; then
break 2 # Sort des deux boucles
fi
echo "i=$i, j=$j"
done
done

continue - Passer à l'itération suivante

# Ignorer les fichiers cachés
for file in *; do
if [[ $file == .* ]]; then
continue
fi
echo "Traitement: $file"
done

# Ignorer les nombres pairs
for i in {1..10}; do
if (( i % 2 == 0 )); then
continue
fi
echo "Impair: $i"
done

Exemple pratique

#!/bin/bash
# Traiter des fichiers avec gestion d'erreurs

for file in *.log; do
# Ignorer si n'existe pas (glob ne match pas)
[ -f "$file" ] || continue

# Ignorer les fichiers vides
[ -s "$file" ] || continue

# Traiter
echo "Traitement de $file..."

# Arrêter en cas d'erreur critique
if ! process_file "$file"; then
echo "Erreur critique, arrêt"
break
fi
done

🔝 Retour à la table des matières



5 - Lecture de fichiers

while read - La méthode recommandée

# Lire ligne par ligne
while IFS= read -r line; do
echo "Ligne: $line"
done < fichier.txt

Explication des options

OptionDescription
IFS=Préserve les espaces en début/fin
-rDésactive l'échappement des backslashs

Exemples

# Lire un fichier CSV
while IFS=, read -r nom age ville; do
echo "Nom: $nom, Age: $age, Ville: $ville"
done < users.csv

# Lire depuis une commande
while IFS= read -r line; do
echo "Process: $line"
done < <(ps aux)

# Lire depuis un pipe
cat /etc/passwd | while IFS=: read -r user _ uid gid _ home shell; do
echo "$user (UID:$uid) -> $shell"
done

Attention aux sous-shells

# PROBLÈME: variable modifiée dans sous-shell
count=0
cat file.txt | while read line; do
((count++)) # Modifié dans sous-shell
done
echo $count # Affiche 0 !

# SOLUTION: redirection
count=0
while read line; do
((count++))
done < file.txt
echo $count # Affiche le bon compte

Lire avec numéro de ligne

linenum=0
while IFS= read -r line; do
((linenum++))
echo "$linenum: $line"
done < fichier.txt

🔝 Retour à la table des matières



6 - Exercices pratiques

Exercice 1 : Table de multiplication

# Afficher la table de multiplication d'un nombre
# donné en argument (de 1 à 10)
Solution
#!/bin/bash
n=${1:-5}
for i in {1..10}; do
echo "$n x $i = $((n * i))"
done

Exercice 2 : Compter les lignes de tous les fichiers

# Parcourir tous les fichiers .sh du répertoire courant
# et afficher le nombre de lignes de chacun
Solution
#!/bin/bash
total=0
for file in *.sh; do
[ -f "$file" ] || continue
lines=$(wc -l < "$file")
echo "$file: $lines lignes"
((total += lines))
done
echo "Total: $total lignes"

Exercice 3 : Lire un fichier CSV

# Lire users.csv (nom,age,email) et afficher
# chaque utilisateur de plus de 30 ans
Solution
#!/bin/bash
while IFS=, read -r nom age email; do
if (( age > 30 )); then
echo "$nom ($email) a $age ans"
fi
done < users.csv

Quiz

Q1. Quelle est la syntaxe d'une boucle for sur une plage de nombres ?

Réponse

for i in {1..10}; do ... done ou for ((i=1; i<=10; i++)); do ... done

Q2. Quelle est la différence entre break et continue ?

Réponse

break sort complètement de la boucle. continue passe à l'itération suivante.

Q3. Comment lire un fichier ligne par ligne en préservant les espaces ?

Réponse

while IFS= read -r line; do ... done < fichier

🔝 Retour à la table des matières



Points clés à retenir

  • for pour itérer sur des listes ou séquences
  • while exécute tant que la condition est vraie
  • until exécute tant que la condition est fausse
  • break sort de la boucle, continue passe à l'itération suivante
  • Toujours utiliser IFS= read -r pour lire des fichiers
  • Attention aux sous-shells avec les pipes !
  • Utiliser "${array[@]}" avec guillemets pour les tableaux

🔝 Retour à la table des matières


← Chapitre précédent | Chapitre suivant : Fonctions →