Table des matières

Boucles & HereDoc

CréationNicolas THOREZ 2020/03/11 16:25

Boucle infinie

Attention. Comme pour tout langage, prévoyez toujours une porte de sortie quand vous utilisez des boucles et ce afin d'éviter de créer des boucles infinies.

Boucles à séquence définie

On parle de boucle à séquence définie lorsque l'on répète un bloc d'instruction avec une quantité d’occurrence définie à l'avance. Il s'agit là d'un traitement similaire sur chaque élément d'un ensemble. Cette ensemble peut être définie par une séquence de nombre donnée par la commande seq, le nombre de ligne dans un fichier, les éléments d'un dossier, etc…

for, in, do, done

for I in $(seq 1 10)
do
    echo "$I"
done

for FILE in $(ls)
do
   du $FILE
done 

for peut avoir une autre écriture dans laquelle on indique la valeur initiale du compteur, une condition mathématique incluant le compteur et égale à 0 et le pas du compteur.

for ((I=0 ; 10 - $I ; I++))
do
    echo "$I"
done

Boucles à séquence variable

Les boucles à séquence variable représente les boucles dont la quantité d'occurrence n'est pas définie au préalable.

while, do, done

while exécute un bloc d'instruction tant que sa condition est vraie.

I=1
while [[ $I -lt 10 ]]
do
    echo "$I"
    I=$(($I + 1))
done

while peut être aussi utilisé pour appliquer un traitement à toute les lignes d'un fichier grâce à l'instruction read et l'injection du fichier en question.

while read LINE
do
    echo "$LINE" | wc -m
done < /home/user/test.txt

until, do, done

until exécute un bloc d'instruction jusqu'à ce que sa condition soit vraie.

I=1
until [[ $I -eq 10 ]]
do
    echo "$I"
    I=$(($I + 1))
done

HereDoc

Quand on écrit des script, on a parfois besoin d'écrire des instructions sur plusieurs lignes pour clarifier le code ou afficher un texte long ou encore envoyer un bloc de commande via SSH, etc… Cependant, en temps normal, un retour à la ligne équivaux à une nouvelle instruction. C'est là qu'intervient le HereDoc. Il permet de délimiter le début et la fin d'un bloc qui sera alors lu comme un seul élément par la commande précédant le HereDoc.

Le début du bloc est spécifié par « suivi d'une balise, généralement EOF qui signifie End Of File. La fin du bloc se fait par une nouvelle écriture de la balise sur une ligne séparée sans autre caractères, tabulations, espace…

Pour des besoins de clarté dans un script, « peut être remplacé par «- ce qui aura pour effet d'ignorer les tabulations en début de ligne et ainsi préservé l'indentation du script.

# Exemple 1
cat << EOF
test
    test2
    EOF
EOF

# Affichera
test
    test2
    EOF
    
# Le premier EOF n'est pas interprété car il est précédé d'une tabulation alors que le second est seul sur sa ligne.

# Exemple 2
cat <<- EOF
test
    test2
    EOF
EOF

# Affichera
test
test2
-bash: EOF : commande introuvable

# Les tabulations ont été ignorées et du fait le premier EOF a terminé le bloc. Le second a donc était interprété comme une commande d'où l'affichage d'une erreur