Loops
Table of contents
1 - for loop
Basic syntax
for variable in liste; do
# commandes
done
Iterating over a list
# 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
Sequence expansion
# 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
C-style for loop
# 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
Iterating over files
# 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)
Iterating over the lines of a command
# 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
🔝 Back to table of contents
2 - while loop
Syntax
while [ condition ]; do
# commandes
done
Examples
# 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
Wait for a 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!"
Interactive menu
#!/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
🔝 Back to table of contents
3 - until loop
Syntax
until [ condition ]; do
# commandes (tant que condition est FAUSSE)
done
until is the opposite of while: it runs as long as the condition is false.
Examples
# 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!"
while vs until comparison
# 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
🔝 Back to table of contents
4 - Flow control: break and continue
break - Exit the loop
# 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 - Move to the next iteration
# 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
Practical example
#!/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
🔝 Back to table of contents
5 - Reading files
while read - The recommended method
# Lire ligne par ligne
while IFS= read -r line; do
echo "Ligne: $line"
done < fichier.txt
Explanation of the options
| Option | Description |
|---|---|
IFS= | Preserves leading/trailing spaces |
-r | Disables backslash escaping |
Examples
# 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
Watch out for subshells
# 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
Read with line numbers
linenum=0
while IFS= read -r line; do
((linenum++))
echo "$linenum: $line"
done < fichier.txt
🔝 Back to table of contents
6 - Practical exercises
Exercise 1: Multiplication table
# 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
Exercise 2: Count the lines of every file
# 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"
Exercise 3: Read a CSV file
# 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. What is the syntax of a for loop over a range of numbers?
Answer
for i in {1..10}; do ... done or for ((i=1; i<=10; i++)); do ... done
Q2. What is the difference between break and continue?
Answer
break exits the loop completely.
continue moves to the next iteration.
Q3. How do you read a file line by line while preserving spaces?
Answer
while IFS= read -r line; do ... done < fichier
🔝 Back to table of contents
Key takeaways
foriterates over lists or sequenceswhileruns as long as the condition is trueuntilruns as long as the condition is falsebreakexits the loop,continuemoves to the next iteration- Always use
IFS= read -rto read files - Watch out for subshells with pipes!
- Use
"${array[@]}"with quotes for arrays