GNU/Linux >> Tutoriels Linux >  >> Linux

Bash For Loop – Le guide le plus pratique

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.
  • pourdansfaire, 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 abc 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.


Linux
  1. Un guide du terminal Linux pour les débutants

  2. Bash For Loop Guide et exemples

  3. Paralléliser une boucle Bash For ?

  4. Limite pratique du nombre d'instantanés Btrfs ?

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

La liste des raccourcis clavier Bash utiles

Bash Scripting - Boucle For expliquée avec des exemples

Un guide pratique pour la commande chroot sous Linux

Comprendre la boucle for dans les scripts shell

La commande apt - Un guide d'utilisation pratique

La boucle Bash FOR expliquée et simplifiée