Dans les scripts shell Bash, les boucles sont utiles pour automatiser les tâches répétitives. Lorsque vous devez répéter une tâche N fois dans votre script, des boucles doivent être utilisées. Il existe trois types de boucles prises en charge dans bash.
- Boucle For
- Boucle While
- Jusqu'à la boucle
Les trois boucles ont le même objectif de répéter la tâche N nombre de fois lorsqu'une condition est satisfaite, mais avec des différences dans la façon dont elles sont définies et utilisées pour obtenir le résultat.
Cet article se concentrera sur la "boucle for" dans les scripts Bash. Nous découvrirons les deux autres boucles dans notre prochain guide.
Syntaxe de la boucle For
La compréhension de la syntaxe est très importante avant d'écrire votre première boucle for loop
.
for NAME in [ LIST OF ITEMS ] do Command 1 Command 2 ..... Command N done
Décomposons-le et voyons ce qu'il fait.
- Commencez par le mot-clé
"for"
suivi d'un nom de variable. - Le mot-clé
"in"
obtenir la liste des éléments et la stocker dans la variable pour chaque itération. - Le mot-clé
"do"
et"done"
marque le début et la fin du bloc de boucle et la commande doit être écrite entre do et done. - Il n'y a pas de règles d'indentation strictes, mais pour une meilleure lisibilité, utilisez 2 espaces ou onglet(4) . Soyez cohérent dans l'utilisation de l'espace ou de la tabulation tout au long de votre script.
Vous pouvez également créer une seule ligne pour les boucles. Créer une for loop
dans le terminal et appuyez sur la touche fléchée vers le haut et vous verrez que bash le convertit automatiquement en une boucle de ligne unique.
for NAME in [ LIST OF ITEMS]; do COMMANDS ; done
Exemple 1 - Utilisation d'une liste d'éléments
Commençons par un exemple simple.
De la section précédente, vous avez peut-être compris que la boucle for loop
accepte une liste d'éléments. La liste des éléments peut être n'importe quoi comme des chaînes, des tableaux, des entiers, des plages, une sortie de commande, etc.
Ouvrez le terminal et exécutez le morceau de code suivant.
N=1 for val in Welcome To Ostechnix do echo "Iteration $N → $val" ((++N)) done
Décomposons-le.
"Welcome to Ostechnix"
est la liste des éléments passés à lafor loop
et chaque mot sera choisi comme une itération séparée et stocké dans une variable (val
).- La variable peut être nommée n'importe quoi. Ici, je le nomme
val
. - Il y a trois éléments dans la liste, il y aura donc trois itérations dans la boucle
for loop
et à chaque fois la valeur de la variableval
est imprimé. - La commande ((
++N
)) agira comme un compteur et incrémentera la valeur de la variableN
afin qu'il puisse être imprimé dans leecho
déclaration.
Maintenant, après avoir exécuté la boucle for loop
ci-dessus commande appuyez sur la touche fléchée vers le haut du terminal et vous pouvez voir la boucle for loop
multiligne est converti en une seule ligne pour une boucle.
Exemple 2 - Utilisation de plages
Vous voudrez peut-être exécuter la boucle for loop
N nombre de fois, pour cela, vous pouvez utiliser le générateur de séquence intégré bash "{x..y[..incr]}"
qui va générer une séquence de nombres.
X
=Valeur entière de départY
=Valeur entière de finIncr
=valeur entière facultative qui incrémente les nombres entiers
Supposons que vous souhaitiez exécuter la boucle cinq fois, vous pouvez alors utiliser l'extrait de code suivant.
for rng in {1..5} do echo "Value is == $rng" done
Vous pouvez également utiliser le paramètre d'incrément facultatif qui effectuera des incréments par étapes.
Jetez un œil à l'extrait ci-dessous où l'incrément de trois est donné. Cela générera la séquence à partir de un et effectuera un incrément de trois jusqu'à la valeur finale dix.
for rng1 in {1..10..3} do echo "Value is == $rng1" done
Exemple 3 - Exécution de commandes
Vous pouvez exécuter toutes les commandes qui dérivent une liste d'éléments à traiter par for loop
. La commande doit être entourée de coches "``
" ou parenthèses "$()
".
Dans l'exemple ci-dessous, j'exécute la commande qui obtiendra l'ID de processus et filtrera les cinq derniers processus. La boucle For va maintenant parcourir chaque ID de processus.
for list in $(ps -ef | awk {' print $2 '} | tail -n 5) do echo $list done
Exemple 4 - Boucle sur les éléments du tableau
Dans les scénarios en temps réel, vous allez stocker certaines valeurs dans des tableaux et essayer de boucler sur le tableau pour un traitement ultérieur.
Avant de comprendre comment parcourir un tableau, vous devez comprendre le comportement de deux variables spéciales ( [email protected]
et $*
). Ce sont deux variables spéciales qui sont utilisées pour accéder à tous les éléments d'un tableau.
Exécutez le morceau de code suivant dans le terminal. Un tableau X est créé et lorsque j'essaie d'imprimer toutes les valeurs ($X
) comme la façon dont j'imprime les variables, il renvoie simplement la première valeur du tableau.
$ X=( 16 09 2021 "Thursday Third Week" )
$ echo $X
16
Pour accéder à tous les éléments d'un tableau, vous devez soit utiliser [email protected]
ou $*
. La syntaxe pour accéder aux valeurs du tableau sera la suivante.
$ echo ${X[@]}
16 09 2021 Thursday Third Week
$ echo ${X[*]}
16 09 2021 Thursday Third Week
Maintenant, utilisez ceci avec for loop
pour parcourir les valeurs du tableau.
X=( 16 09 2021 "Thursday Third Week" ) for items in ${X[@]} do echo $items done
Jetez un oeil à la sortie ci-dessus. Cette sortie semble erronée, car la chaîne (jeudi troisième semaine) à l'intérieur du tableau doit être considérée comme une valeur unique. Mais ici, chaque élément est traité comme un élément distinct.
Il s'agit du comportement par défaut lorsque vous utilisez [email protected]
ou $
. Pour surmonter cela, incluez la variable d'extension de tableau ([email protected]
ou $
) entre guillemets.
for items in "${X[@]}" do echo $items done
Lorsque vous utilisez des guillemets doubles, [email protected]
et $*
se comporter différemment. Tant que [email protected]
étend le tableau à chaque élément dans un tableau comme indiqué dans l'exemple ci-dessus, $*
développera le tableau entier en une seule valeur.
for items in "${X[*]}" do echo $items done
Attention : Les deux [email protected]
et $*
se comporte de manière identique à moins qu'il ne soit entouré de guillemets doubles . Essayez d'éviter $*
à moins que cela ne soit nécessaire.
Exemple 5 - Style C pour la syntaxe des boucles
Bash propose également c style for loop
syntaxe. Si vous êtes d'un C connaissance de la langue, cette syntaxe ne sera pas nouvelle pour vous.
Au lieu de parcourir une liste, vous évaluerez une condition et si la condition est vraie, les commandes de la boucle seront exécutées.
Il y a trois paramètres que vous devez comprendre dans cette syntaxe.
- Variables - Une variable n'est initialisée qu'une seule fois lors du déclenchement de la boucle.
- État - La condition doit être vraie pour que la boucle soit exécutée, sinon la boucle ne s'exécutera pas.
- Compteur - Cela incrémentera la valeur de la variable.
Chaque paramètre doit être séparé par un point virgule (;
) et doit être placé entre doubles crochets comme indiqué ci-dessous.
for (( variable; condition; counter )) do Command 1 Command 2 Command N done
Jetez un œil à l'exemple d'année bissextile ci-dessous.
- La variable
YEAR=2010
sera d'abord initialisé. - La condition
YEAR<=20
sera évalué et s'il est vrai, le code entredo
et ledone
bloc sera exécuté. - Le compteur
YEAR++
incrémentera l'année d'un compte. Jusqu'à la variableYEAR
est incrémenté à2020
, la boucle va itérer. - Dans
do
etdone
bloc, une instruction conditionnelle est écrite pour vérifier si l'année est bissextile ou non.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else echo "$YEAR = not a leap year" fi done
Exemple 6 - Utilisation de l'instruction Break, Continue
Deux mots-clés intégrés bash sont utilisés pour contrôler le flux de vos boucles.
- Pause - Quitte la boucle et ignore les itérations en attente.
- Continuer - Ignorer l'itération en cours et retransmettre le contrôle à la boucle for pour exécuter l'itération suivante.
Pour vérifier s'ils sont intégrés à bash ou non, utilisez type
commande :
$ type break continue break is a shell builtin continue is a shell builtin
Voyons brièvement comment et où les deux pause et continuer peuvent être utilisées.
J'utilise le même code que j'ai utilisé dans la section précédente pour trouver l'année bissextile. Dans ce cas, j'ai juste besoin de ce qui sera la première année bissextile entre 2010 et 2020. Si cette année est trouvée, ma boucle peut sortir.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" break else echo "$YEAR = not a leap year" fi done
À partir de la sortie ci-dessus, vous pouvez voir for loop
itère, et lorsque la première année bissextile 2012 est trouvée, break
l'instruction est lue et la boucle est quittée et le contrôle est rendu au terminal.
Maintenant, je modifie le même code pour le "continue"
déclaration. Le continue
lorsqu'elle est interprétée, elle ignorera l'itération en cours, c'est-à-dire quel que soit le code qui vient après l'instruction continue et passera le contrôle à for loop
pour exécuter la prochaine itération.
for ((YEAR=2010; YEAR<=2020; YEAR++)) do if [[ $(expr $YEAR % 4) -eq 0 ]] then echo "$YEAR = leap year" else continue echo "$YEAR = not a leap year" fi done
Dans l'image ci-dessus, vous pouvez voir qu'il y a une instruction echo qui est ignorée par l'instruction continue.
Exemple 7 - Utilisation de l'instruction True
Lorsque vous créez des boucles ou des instructions conditionnelles, vous ne pouvez pas laisser le bloc de code vide. Bash renverra une erreur de syntaxe.
Jetez un œil aux deux images ci-dessus. Dans la première image, j'ai créé une boucle for loop
mais pas de commandes entre do
et done
. De même dans la deuxième image, j'ai laissé la clause else vide. Dans les deux cas, bash n'accepte pas les blocs vides et génère des erreurs de syntaxe.
Vous pouvez utiliser bash builtin “true"
mot-clé qui sera toujours défini comme code de sortie sur 0 (Succès).
$ type true true is a shell builtin
De cette façon, vous laissez le bloc de code vide sans que bash ne génère d'erreurs.
Conclusion
Dans ce guide de boucle for Bash, nous avons commencé par l'introduction aux boucles et à la syntaxe de for loop
avec le style C. Nous avons également vu comment utiliser les boucles for dans différentes conditions avec les instructions de contrôle de boucle break et continue. Consultez notre prochain guide pour en savoir plus sur Bash While
et Until
boucles avec des exemples.
- Scripts bash :boucle While et Until expliquée à l'aide d'exemples
Lire connexe :
- Scripts bash – Fonctions expliquées à l'aide d'exemples
- Scripts bash – Variables expliquées à l'aide d'exemples
- La commande Bash Echo expliquée avec des exemples sous Linux
- Tutoriel Bash Heredoc pour les débutants
- La redirection bash expliquée avec des exemples
- Différence entre la définition de variables bash avec et sans exportation