Cet article continue la série d'articles Bash et se concentre sur les itérations. Les boucles dans Bash sont pratiques pour tout administrateur système et programmeur. Les constructions en boucle dans n'importe quel langage de script vous permettent d'exécuter plusieurs commandes et de continuer à les exécuter jusqu'à ce qu'une situation spécifique soit atteinte. En termes simples, les boucles sont utiles pour automatiser les tâches répétitives. Il existe trois constructions de boucle dans un langage de script shell :
- Pendant que -boucle.
- Pour -boucle.
- Jusqu'à -boucle.
Un pour -loop est une instruction d'itération en langage Bash utilisée pour effectuer un ensemble d'actions. Vous pouvez l'utiliser sur une invite de shell ou dans un script shell lui-même. Il fonctionne sur des listes d'éléments et répète un ensemble de commandes pour chaque élément de la liste.
Syntaxe de base
La syntaxe de base est indiquée ci-dessous :
for item in [LIST]
do
COMMANDS
done
Où :
- LISTE est une série de chaînes ou de nombres séparés par des espaces.
- COMMANDES est un ensemble de commandes qui s'exécutent sur une liste d'éléments.
- pour , dans , faire, et terminé sont des mots-clés de syntaxe de boucle.
- élément est un nom de variable Bash utilisé pour accéder à l'élément de la liste.
Itérer sur les nombres
Vous pouvez utiliser ce type de boucle pour parcourir une série de nombres ou une liste numérique jusqu'à ce que la liste soit épuisée.
Dans l'exemple suivant, nous parcourons les nombres 1 2 3 4 5 .
#!/bin/bash
for var in 1 2 3 4 5
do
echo "Number is $var"
done
Vous devriez obtenir le résultat suivant :
Number is 1
Number is 2
Number is 3
Number is 4
Number is 5
Dans l'exemple ci-dessus, pour -loop prend chaque élément de la liste, les stocke dans la variable var , et exécute les commandes entre do et terminé .
Vous pouvez également spécifier une plage de nombres en définissant la plage de valeurs.
Dans l'exemple suivant, nous parcourons tous les nombres entre 10 et 15 .
#!/bin/bash
for var in {10..15}
do
echo "Number is $var"
done
Vous devriez obtenir le résultat suivant :
Number is 10
Number is 11
Number is 12
Number is 13
Number is 14
Number is 15
Lorsque vous utilisez une plage spécifique dans la boucle, vous pouvez également spécifier un incrément pour incrémenter chaque nombre.
Dans l'exemple suivant, nous parcourons une plage de nombres à partir de 0 à 10 et incrémentez chaque nombre de 2 :
#!/bin/bash
for var in {0..10..2}
do
echo "Number is $var"
done
Vous devriez obtenir le résultat suivant :
Number is 0
Number is 2
Number is 4
Number is 6
Number is 8
Number is 10
Itérer sur des chaînes
Vous pouvez également utiliser des boucles pour parcourir une liste de chaînes.
Dans l'exemple suivant, nous parcourons une liste de chaînes une par une :
#!/bin/bash
for month in Jan Feb Mar Apr May Jun
do
echo "Month is $month"
done
Vous devriez obtenir le résultat suivant :
Month is Jan
Month is Feb
Month is Mar
Month is Apr
Month is May
Month is Jun
Itérer sur un tableau
Dans l'exemple suivant, nous parcourons tous les éléments du CARS tableau :
#!/bin/bash
CARS=('Maruti' 'Toyota' 'BMW' 'Tata' 'Datsun')
for car in "${CARS[@]}"; do
echo "Car: $car"
done
Vous devriez obtenir le résultat suivant :
Car: Maruti
Car: Toyota
Car: BMW
Car: Tata
Car: Datsun
Dans l'exemple suivant, pour -loops itère tous les éléments d'un tableau en semaine.
#!/bin/bash
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays
do
echo "Weekday $((i++)): $day"
done
Vous devriez obtenir le résultat suivant :
Weekday 1: Mon
Weekday 2: Tue
Weekday 3: Wed
Weekday 4: Thu
Weekday 5: Fri
Boucles infinies
Vous pouvez créer une boucle infinie en utilisant les expressions vides.
#!/bin/bash
for (( ; ; ))
do
echo "Infinite Loops [ press CTRL+C to stop]"
done
Vous devriez obtenir le résultat suivant :
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Infinite Loops [ press CTRL+C to stop]
Vous pouvez appuyer sur CRTL+C pour arrêter la boucle infinie.
Instruction de rupture
Vous pouvez utiliser la pause pour sortir de la boucle plus tôt.
Dans l'exemple suivant, nous parcourons les nombres entre 20 à 30 . Nous utiliserons si -instruction pour sortir de la boucle une fois que l'élément itéré actuel est égal à 27 .
#!/bin/bash
for var in {20..30}
do
if [[ "$var" == '27' ]]; then
break
fi
echo "Number is: $var"
done
Vous devriez obtenir le résultat suivant :
Number is: 20
Number is: 21
Number is: 22
Number is: 23
Number is: 24
Number is: 25
Number is: 26
Continuer l'instruction
L'instruction continue est utilisée à l'intérieur des boucles. Lorsqu'une instruction continue est rencontrée à l'intérieur d'une boucle, le flux de contrôle saute au début de la boucle pour l'itération suivante, sautant l'exécution des instructions à l'intérieur du corps de la boucle pour l'itération en cours.
Dans l'exemple suivant, nous parcourons les nombres entre 10 à 15 . Lorsque l'élément itéré actuel est égal à 13 , l'instruction continue arrête l'exécution, retourne au début de la boucle et continue avec l'itération suivante :
#!/bin/bash
for var in {10..15}
do
if [[ "$var" == '13' ]]; then
continue
fi
echo "Number is: $var"
done
Vous devriez obtenir le résultat suivant :
Number is: 10
Number is: 11
Number is: 12
Number is: 14
Number is: 15
Exemples avancés
Renommer l'extension de fichier
Cette section vous montrera comment changer l'extension de tous les fichiers du répertoire.
L'exemple suivant changera l'extension de tous les fichiers du répertoire actuel de .php vers .html .
#!/bin/bash
for file in *.php; do
mv "$file" "${file%.php}.html"
echo $file is renamed to "${file%.php}.html"
done
Vous devriez obtenir le résultat suivant :
admin.php is converted to admin.html
ajax.php is converted to ajax.html
composer.php is converted to composer.html
index.php is converted to index.html
login.php is converted to login.html
Afficher le nombre de fois de suite
Dans cet exemple, nous afficherons l'heure actuelle du système toutes les 2 secondes.
#!/bin/bash
for now in {1..5}
do
date
sleep 2
done
Vous devriez obtenir le résultat suivant :
Fri Dec 4 12:19:10 IST 2020
Fri Dec 4 12:19:12 IST 2020
Fri Dec 4 12:19:14 IST 2020
Fri Dec 4 12:19:16 IST 2020
Fri Dec 4 12:19:18 IST 2020
Décompresser plusieurs fichiers tar
Vous pouvez effectuer la même action sur tous les fichiers avec la même extension. Par exemple, décompressons plusieurs fichiers dans le répertoire.
L'exemple suivant extraira tous les fichiers tar situés dans le répertoire courant :
#!/bin/bash
for var in *.tar
do
echo "Processing $var..."
tar -xf "$var"
done
Pinger plusieurs serveurs
Vous pouvez utiliser une expression de boucle pour envoyer un ping à plusieurs serveurs de la liste.
Commencez par créer un fichier nommé domaine.txt et ajoutez tous les serveurs à ce fichier, comme indiqué ci-dessous :
cat domain.txt
Ajoutez les lignes suivantes :
google.com
facebook.com
yahoo.com
wordpress.com
Maintenant, envoyons un ping à tous les serveurs répertoriés dans le fichier domain.txt comme indiqué ci-dessous :
#!/bin/bash
for var in $(cat domain.txt)
do
ping -c 1 "$var"
done
Vous devriez obtenir le résultat suivant :
PING google.com (216.58.203.14) 56(84) bytes of data.
64 bytes from hkg12s09-in-f14.1e100.net (216.58.203.14): icmp_seq=1 ttl=117 time=119 ms
--- google.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 119.469/119.469/119.469/0.000 ms
PING facebook.com (69.171.250.35) 56(84) bytes of data.
64 bytes from edge-star-mini-shv-01-any2.facebook.com (69.171.250.35): icmp_seq=1 ttl=56 time=43.9 ms
--- facebook.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 43.994/43.994/43.994/0.000 ms
PING yahoo.com (74.6.231.21) 56(84) bytes of data.
64 bytes from media-router-fp74.prod.media.vip.ne1.yahoo.com (74.6.231.21): icmp_seq=1 ttl=51 time=371 ms
--- yahoo.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 371.135/371.135/371.135/0.000 ms
PING wordpress.com (192.0.78.9) 56(84) bytes of data.
64 bytes from 192.0.78.9: icmp_seq=1 ttl=56 time=40.1 ms
--- wordpress.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 40.162/40.162/40.162/0.000 ms
Liste des fichiers avec conditions
Voici un exemple montrant comment répertorier tous les fichiers d'un répertoire spécifique qui correspondent à des conditions spécifiques.
Par exemple, répertoriez tous .conf fichiers dans /etc répertoire commençant par a , b , c ou d lettres :
#!/bin/bash
i=1
for file in /etc/[abcd]*.conf
do
echo "File $((i++)) : $file"
done
Vous devriez obtenir la liste de tous les fichiers dans la sortie suivante :
File 1 : /etc/adduser.conf
File 2 : /etc/apg.conf
File 3 : /etc/blkid.conf
File 4 : /etc/brltty.conf
File 5 : /etc/ca-certificates.conf
File 6 : /etc/colord.conf
File 7 : /etc/debconf.conf
File 8 : /etc/deluser.conf
Résumé
Dans cet article, nous avons couvert divers exemples d'utilisation de Bash pour -boucles. Nous espérons que vous avez maintenant une idée de la façon dont vous pouvez automatiser vos propres tâches quotidiennes. Si l'article vous a été utile, merci de nous aider à le diffuser dans le monde entier.