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.
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 readpour les lignes, jamaisfor 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 =-gtou(( )).forsur 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), maisgrep -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.