Devmind.
Menu

Apprendre, à votre rythme

Tous les cursus sont accessibles sans compte.

Chapitre 10 / Notion

Tests, boucles et conditions fiables

if qui se trompe de test, boucle qui tourne sur du vide, comparaison string vs nombre : 80 % des bugs de script viennent des tests, pas de la logique.

◷ 12 minutesTravail sur votre machine

Prérequis : cours précédent ; boucles et compteurs.

Pourquoi

if qui se trompe de test, boucle qui tourne sur du vide, comparaison string vs nombre : 80 % des bugs de script viennent des tests, pas de la logique. Les formes sûres s'apprennent une fois.

Concepts

  • [[ ]] > [ ] : double crochets (bash) : pas de word-splitting surprise, &&/|| dedans, regex avec =~. Simple [ = POSIX portable mais piégeux.
  • Tests fichiers : -f (fichier), -d (dossier), -s (non vide), -r/-w/-x (droits). Tester avant d'agir (dump non vide !).
  • Comparaisons : strings ==/!=, nombres -eq/-gt/-lt (ou (( )) arithmétique). [[ 10 > 9 ]] = comparaison STRING (faux !) vs (( 10 > 9 )) = vrai.
  • Boucles sûres : for f in "$dir"/* (vide = pattern littéral ! tester [[ -e $f ]] || continue), while read pour les lignes, jamais for i in $(cat…) (espaces !).

Exemple : boucle qui ne casse rien

for f in "$BACKUP_DIR"/*.sql.gz; do
  [[ -e "$f" ]] || continue          # dossier vide : ne pas traiter le pattern
  [[ -s "$f" ]] || { echo "vide : $f"; exit 1; }
  echo "OK $f ($(du -h "$f" | cut -f1))"
done

Cas réel

Boucle for u in $(cat users.txt) avec « Jean Dupont » : 2 itérations (Jean, Dupont) au lieu d'une — actions appliquées aux mauvais comptes. while IFS= read -r : lignes intactes.

Pièges

  • [[ 10 > 9 ]] faux (string !) : nombres = -gt ou (( )).
  • for sur glob vide : traite le pattern littéral — garde [[ -e ]].
  • set -e + test en condition : if grep -q… ne déclenche pas l'exit (contexte conditionnel ok), mais grep -q… && seul si !

À retenir

[[ ]] toujours, nombres avec -gt/(())), gardes sur globs, while read pour les lignes.

Pas de correction en ligneConfrontez votre code aux résultats attendus du cours.