Skip to main content

Loops


Table of contents

  1. for loop
  2. while loop
  3. until loop
  4. Flow control: break and continue
  5. Reading files
  6. Practical exercises


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

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

Explanation of the options

OptionDescription
IFS=Preserves leading/trailing spaces
-rDisables 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

  • for iterates over lists or sequences
  • while runs as long as the condition is true
  • until runs as long as the condition is false
  • break exits the loop, continue moves to the next iteration
  • Always use IFS= read -r to read files
  • Watch out for subshells with pipes!
  • Use "${array[@]}" with quotes for arrays

🔝 Back to table of contents


← Previous chapter | Next chapter: Functions →