GNU/Linux >> Tutoriels Linux >  >> Linux

Bash Scripting - Boucle For expliquée avec des exemples

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.

  1. Boucle For
  2. Boucle While
  3. 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 à la for 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 variable val est imprimé.
  • La commande ((++N )) agira comme un compteur et incrémentera la valeur de la variable N afin qu'il puisse être imprimé dans le echo 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épart
  • Y =Valeur entière de fin
  • Incr =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 entre do et le done bloc sera exécuté.
  • Le compteur YEAR++ incrémentera l'année d'un compte. Jusqu'à la variable YEAR est incrémenté à 2020 , la boucle va itérer.
  • Dans do et done 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

Linux
  1. Bash For Loop Guide et exemples

  2. Bash pour la boucle

  3. Exemples de boucle Bash For et de boucle While

  4. 12 exemples de boucle Bash For pour votre script de shell Linux

  5. Bash for loop Exemples

Bash Scripting - Tableau associatif expliqué avec des exemples

Bash Scripting - Tableau indexé expliqué avec des exemples

Bash For Loops avec des exemples

Bash Scripting Part2 - Boucles For et While avec exemples

La boucle Bash FOR expliquée et simplifiée

Script bash pour la boucle expliqué avec des exemples