Objectifs
- Arrêter une boucle prématurément avec l’instruction
break. - Sauter à l’itération suivante d’une boucle avec
continue. - Appliquer ces instructions pour rendre des scripts de recherche ou de filtrage plus efficaces et lisibles.
- Comprendre comment contrôler des boucles imbriquées (notion avancée).
Explications détaillées
Notions clés
Parfois, il n’est pas nécessaire d’exécuter une boucle jusqu’à sa fin naturelle. break et continue vous donnent un contrôle plus fin sur le déroulement de vos boucles for, while et until.
break : La sortie d’urgence
L’instruction break interrompt immédiatement la boucle dans laquelle elle se trouve. L’exécution du script reprend à la première ligne après le done de la boucle.
C’est l’outil parfait pour une recherche : une fois que vous avez trouvé ce que vous cherchiez, il est inutile de continuer à boucler.
continue : Sauter cette itération
L’instruction continue arrête l’itération actuelle de la boucle et passe directement à la suivante. Le code situé après continue dans le corps de la boucle n’est pas exécuté pour cette itération.
C’est très pratique pour le filtrage : si un élément ne correspond pas à vos critères, vous pouvez l’ignorer et passer au suivant sans avoir à imbriquer tout le reste de votre logique dans un if.
Contrôle des boucles imbriquées (avancé)
break et continue peuvent prendre un argument numérique (n) pour agir sur des boucles imbriquées.
break 2: Sort de 2 niveaux de boucles imbriquées.continue 2: Passe à l’itération suivante de la boucle externe.
Cet usage est plus rare, mais utile à connaître.
Syntaxe / Usages
# Dans une boucle for
for item in "${ma_liste[@]}"; do
if [[ condition_arret ]]; then
break
fi
if [[ condition_saut ]]; then
continue
fi
# Traitement normal
done
# Dans une boucle while
while true; do
# ...
if [[ condition_sortie ]]; then
break
fi
done
Exemples
# 1. Recherche avec 'break'
# Trouver le premier utilisateur 'root' dans /etc/passwd
while IFS=':' read -r user pass uid gid gecos home shell; do
if [[ "$user" == "root" ]]; then
echo "Trouvé ! Le shell de root est : $shell"
break # Inutile de continuer à lire le fichier
fi
done < /etc/passwd
# 2. Filtrage avec 'continue'
# Afficher uniquement les dossiers dans le répertoire courant
for item in *; do
# Si l'élément n'est pas un dossier, on passe au suivant
if [[ ! -d "$item" ]]; then
continue
fi
echo "'$item' est un dossier."
done
# 3. Boucle de jeu simple
while true; do
read -p "Tapez 'start' pour commencer ou 'exit' pour quitter : " cmd
if [[ "$cmd" == "exit" ]]; then
echo "Au revoir !"
break
fi
if [[ "$cmd" != "start" ]]; then
echo "Commande non reconnue."
continue
fi
echo "Le jeu commence..."
# (Ici, la logique du jeu)
echo "Fin de la partie."
done
Bonnes pratiques
- Utilisez
breakdans les boucles de recherche pour améliorer l’efficacité. Pourquoi continuer à chercher si vous avez déjà trouvé ? - Utilisez
continueau début d’une boucle comme une “garde” pour écarter les cas non pertinents. Cela évite d’imbriquer tout votre code dans un blocifet améliore la lisibilité. - Dans une boucle
while true, assurez-vous qu’il y a toujours un chemin logique qui mène à unbreak, sinon vous avez créé une boucle infinie.
Pièges courants
- Agir sur la mauvaise boucle : Dans des boucles imbriquées,
breaketcontinuen’affectent que la boucle la plus interne, sauf si vous spécifiez un niveau (break 2). - Logique trop complexe : Un script avec de nombreux
breaketcontinuepeut devenir difficile à suivre. Si c’est le cas, il est souvent plus clair de réorganiser la logique ou de la découper en fonctions.
Exercices
-
Trouver le coupable :
- Écrivez un script qui lit un fichier
logs.txtligne par ligne. - Le script doit s’arrêter et afficher “Alerte ! Erreur critique trouvée.” dès qu’il rencontre une ligne contenant le mot “CRITICAL”.
- Créez un fichier
logs.txtpour tester.
- Écrivez un script qui lit un fichier
-
Nettoyage de printemps :
- Créez un dossier avec quelques fichiers de test (
a.txt,b.log,image.jpg,c.txt). - Écrivez un script qui parcourt tous les fichiers du dossier.
- Il doit supprimer uniquement les fichiers se terminant par
.logou.txt. Utilisezcontinuepour ignorer les autres fichiers (comme.jpg). - Affichez le nom de chaque fichier que vous supprimez.
- Créez un dossier avec quelques fichiers de test (
-
Compteur limité :
- Écrivez une boucle
whilequi incrémente un compteur de 1 à 10. - La boucle doit utiliser
continuepour ne pas afficher les nombres 3 et 7. - Elle doit utiliser
breakpour s’arrêter si le compteur dépasse 9 (même si la condition de la boucle va jusqu’à 10). - Le script devrait donc afficher : 1, 2, 4, 5, 6, 8, 9.
- Écrivez une boucle