9 exemples de boucles for dans les scripts Linux Bash

0
62
fatmawati achmad zaenuri/Shutterstock.com

La boucle for polyvalente de Bash fait bien plus que boucler un certain nombre de fois. Nous décrivons ses nombreuses variantes afin que vous puissiez les utiliser avec succès dans vos propres scripts Linux.

La boucle for

Tous les langages de script et de programmation ont un moyen de gérer les boucles. Une boucle est une section de code que vous souhaitez exécuter à plusieurs reprises. Plutôt que de taper le même ensemble d'instructions dans votre script, encore et encore, une boucle répétera une section de code encore et encore pour vous.

RELATED9 exemples de scripts Bash pour démarrer sur Linux

La boucle for de Bash est très flexible. Il peut fonctionner avec des nombres, des mots, des tableaux, des variables de ligne de commande ou la sortie d'autres commandes. Ceux-ci sont utilisés dans l'en-tête de la boucle. L'en-tête dicte avec quoi la boucle fonctionne – des nombres ou des chaînes, par exemple – et quelle est la condition de fin qui arrêtera la boucle.

Le corps de la boucle contient le code que vous veux avoir répété. Il contient ce que vous voulez que la boucle fasse. Le corps de la boucle peut contenir n'importe quelle commande de script valide.

Une variable appelée compteur de boucle ou itérateur est utilisée pour parcourir une plage de valeurs ou une liste d'éléments de données. Pour chaque boucle, l'itérateur prend la valeur du nombre, de la chaîne ou du type de données suivant sur lequel la boucle itère. Cela permet à la boucle de travailler avec les valeurs de chacun des éléments de données à tour de rôle, ou même dans certains cas de manipuler les éléments de données eux-mêmes.

Simple for Loops< /h2>

Si vous cherchez à écrire votre première boucle for, ces exemples simples vous aideront à démarrer.

boucles for en utilisant des listes numériques

Vous pouvez exécuter une boucle for sur la ligne de commande. Cette commande crée et exécute une boucle for simple. L'itérateur est une variable appelée i. Nous allons attribuer i à chacune des valeurs de la liste de nombres, à tour de rôle. Le corps de la boucle va imprimer cette valeur dans la fenêtre du terminal. La condition qui termine cette boucle est lorsque i a parcouru toute la liste de nombres.

for i in 1 2 3 4 5; faites echo $i ; fait

Il est important de noter ici que la variable i est augmentée d'un à chaque fois que la boucle tourne, mais c'est parce que la liste des nombres augmente d'un à chaque fois.

Ceci la liste des nombres commence à 3 et monte par paliers de deux, puis saute arbitrairement à 44.

for i in 3 5 7 9 11 44 ; faites echo $i ; done

Cela ne fait aucune différence pour la boucle for. Il commence à une extrémité de la liste et utilise chaque valeur à tour de rôle, jusqu'à ce que toutes les valeurs de la liste aient été utilisées.

Les nombres n'ont pas non plus besoin d'être dans l'ordre croissant. Ils peuvent être dans n'importe quel ordre.

pour je dans 3 43 44 11 9 ; faites echo $i ; done

pour les boucles utilisant des listes de mots

Nous pouvons tout aussi bien faire la même chose avec des mots. Copiez le texte du script dans un éditeur et enregistrez-le sous “word-list.sh.”

#!/bin/bash for word in Ceci est une séquence de mots do   echo $word fait

Vous devrez utiliser chmod pour rendre le script exécutable, et tout autre script que vous copiez à partir de cet article. Remplacez simplement le nom du script chaque fois que vous utilisez la commande chmod.

chmod +x word-list.sh

Exécutons le script.

./word-list.sh

Tout comme il l'a fait avec les nombres, l'itérateur—dans cet exemple, le mot variable—parcourt la liste des éléments de données jusqu'à ce qu'il atteigne la fin de la liste. Le corps de la boucle accède à la valeur dans la variable word et ainsi chaque mot de la liste est traité.

for Loops with Number Ranges

< p>Si vous vouliez qu'une boucle for s'exécute 100 fois, il serait assez fastidieux de devoir taper une séquence de 100 chiffres dans l'en-tête de la boucle. Les plages de nombres vous permettent de spécifier uniquement le premier et le dernier nombre.

Ce script est “number-range.sh.”

#!/bin/bash for i in { 1..10} do   echo “Loop spin:” $i done

La plage de numéros est définie entre accolades “{}” avec deux périodes “..” séparant les nombres qui commencent et terminent la plage. Assurez-vous de ne pas inclure d'espace dans la définition de la plage.

Voici comment cela fonctionne :

./number-range.sh

Vous pouvez inclure un autre nombre qui définit la taille de pas que l'itérateur doit utiliser pour parcourir les nombres de la plage. Ce script, “number-range2.sh” utilisera une plage de 0 à 32 et une taille de pas de 4.

#!/bin/bash for i in {0..32..4} do   echo “Loop spin:” $i done

L'itérateur parcourt la plage de nombres par sauts de quatre.

./number-range2.sh

< h3 id="for-loops-using-filenames">pour les boucles utilisant des noms de fichiers

Parce que nous pouvons traiter des listes de mots, nous pouvons faire fonctionner nos scripts avec des noms de fichiers. Ce script s'appelle “filenames.sh.”

#!/bin/bash pour le fichier dans word-list.sh number-range.sh number-range2.sh filenames.sh do   ls – lh “$file” done

Il serait assez inutile d'avoir un script qui ne fait que ce que ls peut faire, mais il montre comment accéder aux noms de fichiers à l'intérieur du corps de la boucle.

./filenames.sh

De la même manière que pour l'utilisation de la plage de numéros, nous pouvons utiliser un modèle de fichier dans l'en-tête de la boucle pour spécifier les fichiers que nous voulons traiter. Cela évite beaucoup de saisie et signifie que nous n'avons pas besoin de connaître à l'avance les noms des fichiers.

Ce script s'appelle “filenames2.sh.” Nous avons remplacé la liste des noms de fichiers par le modèle de nom de fichier “*.sh” pour que le script rapporte sur tous les fichiers de script du répertoire courant.

#!/bin/bash pour le fichier dans *.sh do   ls -lh “$file” done

Voici le résultat.

./filenames2.sh

pour les boucles utilisant des paramètres de ligne de commande

Nous pouvons ajouter un peu plus de flexibilité en transmettant le modèle de nom de fichier sur la ligne de commande. La variable $* représente tous les paramètres de ligne de commande passés au script.

Il s'agit de “filenames3.sh.”

#!/bin/bash pour le fichier dans $* do   ls -lh “$file” done

Nous vous demanderons les noms de fichiers commençant par “n” et avoir une extension SH.

./filenames3.sh n*.sh

Nous pouvons également transmettre plusieurs modèles à la fois.

./filenames3.sh n*. sh .bashrc

Le fichier de variables d'itérateur prend la valeur de chacun des paramètres de ligne de commande. Les modèles de noms de fichiers sont développés et tous les noms de fichiers sont traités dans le corps de la boucle.

RELATED : Comment travailler avec des variables dans Bash

C-like for loops

Bash prend en charge les boucles for classiques à trois termes, telles que celles trouvées dans la programmation C Langue. Elles sont appelées boucles for à trois termes car il y a trois termes dans l'en-tête de boucle.

  • La valeur initiale de l'itérateur de boucle.
  • Le test pour savoir si la boucle continue ou se termine.
  • L'incrémentation—ou la décrémentation—de l'itérateur.

Ce script est “c-like.sh .”

L'itérateur I est défini sur 1 au début de la boucle, et la boucle s'exécutera aussi longtemps que l'instruction ” je<=10 ” est vrai. Dès que i atteint 11, la boucle for s'arrête. L'itérateur est augmenté d'une unité à chaque révolution de la boucle.

#!/bin/bash for (( i=1; i<=10; i++ )) do   echo “Loop number:” $i done < p>Exécutons ce script.

./c-like.sh

La boucle for de type C permet de créer facilement des boucles for qui ont des exigences légèrement étranges. Cette boucle commence à 15 et compte à rebours par pas de 3. C'est “c-like2.sh”

#!/bin/bash for (( i=15; i>0; i -=3 )) do   echo “Numéro de boucle :” $i done

Lorsque nous l'exécutons, il devrait revenir en arrière par étapes de trois.

./c-like2.sh

Infinite for Loops

Vous pouvez également utiliser ce format de boucle for pour créer une boucle infinie. Tout ce que vous avez à faire est de supprimer tous les éléments de l'en-tête de la boucle, comme ceci. C'est “infinite.sh.”

#!/bin/bash for (( ; ; )) do   echo “Press Ctrl+C to stop…”   sleep 1 done

Vous devrez appuyer sur Ctrl+C pour arrêter la boucle.

./infinite.sh

pour les boucles utilisant des tableaux de mots

Nous pouvons facilement parcourir un tableau de mots. Nous devons fournir le nom du tableau dans l'en-tête de la boucle, et l'itérateur parcourra toutes les entrées du tableau. Ceci est “word-array.sh.”

#!/bin/bash distributions=(“Ubuntu Fedora Manjaro Arch EndeavourOS Garuda”) pour la distribution dans $distributions do   echo $distro done

Toutes les distributions sont listées pour nous.

./word-array.sh

La commande continue

Si vous souhaitez que la boucle parcoure une entrée particulière, testez si l'itérateur correspond à cette entrée et utilisez la commande continue. La commande continue abandonne la rotation actuelle de la boucle. Il incrémente l'itérateur et démarre la rotation suivante de la boucle, en supposant que l'entrée que vous souhaitez ignorer n'est pas le dernier élément de la liste.

C'est un “mot- array2.sh.” Il enjambe la "Arche" entrée de tableau mais traite tous les autres membres du tableau.

#!/bin/bash distributions=(“Ubuntu Fedora Manjaro Arch EndeavourOS Garuda”) pour la distribution dans $distributions do   if [[ “$distro” == “Arch” ]] ; then     continue   fi   echo $distro done

“Arch” n'apparaît pas dans la fenêtre du terminal.

./word-array2.sh

La commande break

La commande break sort de la boucle et empêche tout autre traitement.

C'est “word-array3.sh.” C'est le même que le script précédent avec continue remplacé par break.

#!/bin/bash distributions=(“Ubuntu Fedora Manjaro Arch EndeavourOS Garuda”) pour la distribution dans $distributions do   if [[ “$ distribution” == “Arch” ]] ; then     break   fi   echo $distro done

Lorsque l'itérateur contient “Arch” la boucle for abandonne tout autre traitement.

./word-array3.sh

pour les boucles utilisant des tableaux associatifs

Dans Bash 4 et les versions ultérieures, les tableaux associatifs vous permettent de créer des listes de paires clé-valeur pouvant être recherchées par clé ou par valeur. En raison de la relation bidirectionnelle entre la clé et la valeur, ils sont également appelés dictionnaires de données.

RELATEDQue sont les dictionnaires Bash sous Linux et comment les utilisez-vous ?

Nous pouvons parcourir un tableau associatif en utilisant une boucle for. Ce script est “associative.sh.” Il définit un tableau associatif avec quatre entrées, une pour chacun de “chien”, “chat”, “robin” , et “humain.” Ce sont les clés. Les valeurs sont le nombre (par défaut) de pattes qu'ils ont chacun.

#!/bin/bash declare -A animals=( [dog]=Four-legged [cat]=Four-legged [robin]=Two- legged [human]=Two-legged ) for legs in ${!animals[@]} do   if [ ${animals[$legs]} == “Two-legged” ]; then     echo ${legs}   fi done

L'itérateur est appelé jambes . Notez que l'en-tête de la boucle contient un “!” point d'exclamation. Cela n'agit pas comme l'opérateur logique NOT, cela fait partie de la syntaxe du tableau associatif. Il est nécessaire de rechercher dans le tableau.

Le corps de la boucle effectue un test de comparaison de chaînes. Si la valeur du membre du tableau est “Two-legged”, il imprime la valeur de la clé dans la fenêtre du terminal. Lorsque nous l'exécutons, le script imprime les créatures à deux pattes.

./associative.sh

Itération sur la sortie des commandes

Si vous avez une commande ou une séquence de commandes qui produit une liste de quelque chose, comme des noms de fichiers, vous pouvez les parcourir avec une boucle for. Vous devez faire attention aux extensions de nom de fichier inattendues, mais dans les cas simples, tout va bien.

Ce script est “command.sh.” il utilise ls et wc pour fournir une liste triée des noms de fichiers de script, ainsi que leur nombre de lignes, de mots et d'octets.

#!/bin/bash for i in $(ls *.sh | sort); do   echo $(wc $i) done

Lorsque nous l'exécutons, nous obtenons les statistiques pour chaque fichier, avec les fichiers répertoriés par ordre alphabétique.

./command.sh

L'éblouissant pour la boucle

La boucle for est un outil de script polyvalent et facile à comprendre. Mais aussi flexible soit-il, n'oubliez pas que d'autres boucles existent pour une raison. Ne soyez pas ébloui en pensant que la boucle for est tout ce dont vous aurez besoin.

RELATEDComment traiter un fichier ligne par ligne dans un script Linux Bash

La boucle while, par exemple, est bien mieux adaptée à certaines choses que la boucle for, comme la lecture des lignes d'un fichier.

Écrire de bons scripts signifie utiliser l'outil le plus adapté à la tâche à accomplir. La boucle for est un excellent outil à avoir dans votre boîte à outils d'astuces.

LIRE LA SUITE

  • › Pourquoi voulez-vous un Wi-Fi maillé, même si vous n'avez besoin que d'un seul routeur
  • &rsaquo ; Test de la tablette Amazon Fire 7 (2022) : faible mais bon marché
  • › Les 5 plus grands mythes sur Android
  • &rsaquo ; Examen du chargeur UGREEN Nexode 100 W : plus qu'assez de puissance
  • &rsaquo ; Le Samsung Galaxy Z Flip 4 a des mises à niveau internes, pas des modifications de conception
  • › 10 fonctionnalités iPhone que vous devriez utiliser