Retour au cours

break continue

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 break dans les boucles de recherche pour améliorer l’efficacité. Pourquoi continuer à chercher si vous avez déjà trouvé ?
  • Utilisez continue au début d’une boucle comme une “garde” pour écarter les cas non pertinents. Cela évite d’imbriquer tout votre code dans un bloc if et améliore la lisibilité.
  • Dans une boucle while true, assurez-vous qu’il y a toujours un chemin logique qui mène à un break, sinon vous avez créé une boucle infinie.

Pièges courants

  • Agir sur la mauvaise boucle : Dans des boucles imbriquées, break et continue n’affectent que la boucle la plus interne, sauf si vous spécifiez un niveau (break 2).
  • Logique trop complexe : Un script avec de nombreux break et continue peut 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

  1. Trouver le coupable :

    • Écrivez un script qui lit un fichier logs.txt ligne 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.txt pour tester.
  2. 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 .log ou .txt. Utilisez continue pour ignorer les autres fichiers (comme .jpg).
    • Affichez le nom de chaque fichier que vous supprimez.
  3. Compteur limité :

    • Écrivez une boucle while qui incrémente un compteur de 1 à 10.
    • La boucle doit utiliser continue pour ne pas afficher les nombres 3 et 7.
    • Elle doit utiliser break pour 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.