Les boucles dans les scripts shell
L'itération à travers une série de commandes est une pratique de programmation courante. Souvent, vous devez répéter un ensemble de commandes jusqu'à ce qu'une condition spécifique soit remplie, telle que le traitement de tous les fichiers d'un répertoire, de tous les utilisateurs d'un système ou de toutes les lignes d'un fichier texte.
Le shell Bash fournit trois structures pour contrôler les boucles : for, while et until. Elles ont chacune une valeur pour l'itération à travers les commandes.
Boucle for
L'interpréteur de commandes Bash fournit la commande for pour vous permettre de créer une boucle qui itère dans une série de valeurs. Chaque itération exécute un ensemble prédéfini de commandes en utilisant l'une des valeurs de la série. Voici le format de base de la commande for du shell Bash.
for var in liste do commandes done
Vous devez spécifier la série de valeurs utilisées dans les itérations dans le paramètre liste. Les valeurs peuvent être spécifiées de plusieurs manières.
A chaque itération, la variable var contient la valeur courante dans la liste. La première itération utilise le premier élément de la liste, la deuxième itération utilise le deuxième élément, et ainsi de suite, jusqu'à ce que tous les éléments de la liste aient été utilisés.
Les commandes entrées entre les instructions do et done peuvent être une ou plusieurs commandes shell Bash standard. Dans les commandes, la variable $var contient la valeur actuelle de l'élément de liste pour l'itération.
L'utilisation la plus basique de la commande for consiste à parcourir une liste de valeurs définies dans la commande for elle-même :
#!/bin/bash for var in Meknes Fes Paris Lille Lyon Rabat do echo "Valeur actuelle de var est : $var" done exit 0
devinfo@ubuntu:~/scripts$ boucle.sh Valeur actuelle de var est : Meknes Valeur actuelle de var est : Fes Valeur actuelle de var est : Paris Valeur actuelle de var est : Lille Valeur actuelle de var est : Lyon Valeur actuelle de var est : Rabat
Pour les grandes séries de chiffres dans vos boucles for, il est pratique d'utiliser la commande seq, au lieu de taper tous les chiffres. Il suffit d'entrer seq suivi du nombre de départ puis du dernier nombre de la série, mais vous devrez utiliser la substitution de commande pour que cela fonctionne correctement :
#!/bin/bash for var in $(seq 1 5) do echo "Valeur actuelle de var est : $var" done exit 0
evinfo@ubuntu:~/scripts$ boucle.sh Valeur actuelle de var est : 1 Valeur actuelle de var est : 2 Valeur actuelle de var est : 3 Valeur actuelle de var est : 4 Valeur actuelle de var est : 5
La substitution de commandes dans la liste vous permet de faire beaucoup de choses avec vos boucles for :
#!/bin/bash for var in $(ls *.sh) do echo "Fichier actuel : $var" done exit 0
devinfo@ubuntu:~/scripts$ boucle.sh Fichier actuel : boucle.sh Fichier actuel : case.sh Fichier actuel : hello.sh Fichier actuel : structure.sh Fichier actuel : trouver.sh Fichier actuel : vars.sh
#!/bin/bash for var in $(cat villes) do echo "Ligne actuelle : $var" done exit 0
devinfo@ubuntu:~/scripts$ cat villes Meknes Fes Paris Lille Lyon Rabat devinfo@ubuntu:~/scripts$ boucle.sh Ligne actuelle : Meknes Ligne actuelle : Fes Ligne actuelle : Paris Ligne actuelle : Lille Ligne actuelle : Lyon Ligne actuelle : Rabat
Boucle while
La commande while se situe quelque peu entre l'instruction if-then et la boucle for. La commande while vous permet de définir une condition (ou commande) à tester, puis de boucler un ensemble de commandes tant que la condition de test définie renvoie une valeur de sortie nulle (true). Elle teste la condition de test au début de chaque itération. Lorsque la condition de test renvoie une valeur de sortie nulle, la commande while arrête d'exécuter l'ensemble des commandes.
Voici la syntaxe de la commande while :
while [ condition ] do commandes done
La condition définie dans la commande while a le même format que dans les instructions if-then. Comme dans l'instruction if-then, vous pouvez utiliser n'importe quelle commande normale de l'interpréteur de commandes Bash, ou vous pouvez utiliser la condition pour tester des conditions, telles que des valeurs de variables.
La clé de la commande while est que l'état de sortie de la condition spécifiée doit changer, en fonction des commandes exécutées pendant la boucle. Si l'état de sortie ne change jamais, la boucle while restera bloquée dans une boucle infinie.
#!/bin/bash a=20 while [ $a -gt 0 ] do echo "a = $a" a=$[ $a - 3 ] done exit
devinfo@ubuntu:~/scripts$ boucle.sh a = 20 a = 17 a = 14 a = 11 a = 8 a = 5 a = 2
Boucle until
La commande until fonctionne exactement à l'inverse de la commande while. La commande until exige que vous spécifiiez une condition de test qui produit normalement une valeur de sortie non nulle (fausse). Tant que l'état de sortie de la condition de test est une valeur de sortie non nulle, le shell Bash exécute les commandes énumérées dans la boucle. Lorsque la condition de test renvoie une valeur de sortie nulle (vraie), la boucle s'arrête.
La syntaxe de la commande until est la suivante :
until [ condition ] do Commandes done
Seul l'état de sortie de la dernière commande détermine si le shell Bash exécute les autres commandes définies. Voici un exemple d'utilisation de la commande until :
#!/bin/bash a=20 until [ $a -lt 0 ] do echo "a = $a" a=$[ $a - 3 ] done exit
devinfo@ubuntu:~/scripts$ boucle.sh a = 20 a = 17 a = 14 a = 11 a = 8 a = 5 a = 2