Ticker

6/recent/ticker-posts

Ad Code

Responsive Advertisement

La boucle for en bash Linux avec +10 exemples

Les boucles sont l’un des concepts fondamentaux des langages de programmation. Les boucles sont pratiques lorsque vous souhaitez exécuter une série de commandes encore et encore jusqu’à ce qu’une certaine condition soit atteinte.

Dans les langages de script tels que Bash, les boucles sont utiles pour automatiser les tâches répétitives.
Il existe trois constructions de boucle de base dans les scripts Bash : la boucle for, la boucle while et la boucle until.

Dans ce tutoriel, nous allons aborder les bases des boucles for dans Bash. Je vous montre également comment utiliser les instructions break et continue pour modifier le déroulement d’une boucle.

La boucle for en bash Linux avec exemples

Comment utiliser une boucle for en bash Linux

La boucle for itère sur une liste d’éléments et exécute l’ensemble des commandes données.
Le séparateur est l’espace.

La syntaxe est la suivante :

for VARIABLE in 1 2 3 4 5 .. N
do
    commande1
    commande2
    commandeN
done

La liste peut être une série de chaînes de caractères séparées par des espaces, une plage de nombres, la sortie d’une commande, un tableau, et ainsi de suite.

Par exemple ici, la variable i va successivement prendre les valeurs 1, 2 jusqu’à 5 et passer dans la boucle do et donne.

#!/bin/bash
for i in 1 2 3 4 5
do
 echo "Bonjour $i"
done
Comment utiliser une boucle for en bash Linux

Les explications en détails :

  • #!/bin/bash – indique que le code est un script bash
  • i – est un caractère de remplacement pour une variable. Pendant ce temps, $i est la valeur individuelle de la variable. Vous pouvez également l’écrire sous la forme c/$c ou sous tout autre nom.
  • in – sépare la variable et les éléments qui suivent
  • 1 2 3 4 5 – est un exemple d’éléments sur lesquels vous voulez exécuter l’instruction
  • do – est le mot clé qui lance les boucles. Il exécute alors l’instruction n fois, n étant le nombre total d’éléments. Ici, la valeur de n est 5
  • echo “Bonjour: $i” – est le code que nous allons répéter n fois. N’oubliez pas que les guillemets transforment tout ce qu’ils contiennent en une variable.
  • done – arrête la boucle
for i in 1 2 3 4 5 ; do echo "Bonjour $i" ; done
Comment utiliser une boucle for en bash Linux

La boucle for en bash Linux avec des exemples

Exemple de boucle for avec des chiffres

Un script Bash qui va exécuter une commande 5 fois, tout en incrémentant la variable à chaque boucle.
Pour cela, on utilise la syntaxe {DEBUT..FIN} .

for i in {1..5}
do
  echo "Bonjour: $i"
  sleep 5
done

La syntaxe suivante est plus proche de celle du langage C.
Voici un exemple de script Bash qui va exécuter une commande 10 fois, tout en incrémentant la variable à chaque boucle.

for (( i=1; i<=10; i++ ))
do  
   echo "Bonjour $i"
done

Exemple de boucle for sur les fichiers

Pour boucler avec for en bash sur les fichiers, vous n’avez pas besoin d’utiliser la commande ls.
Par exemple ci-dessous, on utilise la commande f sur tous les fichiers avec l’extension .txt :

for f in *.txt
do 
  file $f ; 
done
La boucle for en bash Linux avec des exemples

Cela est strictement identique à :

for f in $(ls *.txt)
do 
  file $f ; 
done
La boucle for en bash Linux avec des exemples

Bien entendu, vous pouvez aussi spécifier le contenu d’un répertoire.
Par exemple pour lire les fichiers de /var dans une boucle for :

#!/bin/bash

for i in /var/*
do
        echo $i 
done

Renommer des fichiers

L’exemple suivant montre comment renommer tous les fichiers du répertoire actuel dont le nom contient un espace en remplaçant l’espace par un trait de soulignement :

for fichier in *\ *; do
  mv "$fichier" "${fichier// /_}"
done

Décomposons le code ligne par ligne :

  • La première ligne crée une boucle for et itère dans une liste de tous les fichiers dont le nom contient un espace. L’expression *\ * crée la liste
  • La deuxième ligne s’applique à chaque élément de la liste et déplace le fichier vers un nouveau en remplaçant l’espace par un trait de soulignement (). La partie ${fichier// /} utilise l’expansion des paramètres du shell pour remplacer un motif dans un paramètre par une chaîne de caractères
  • done indique la fin du segment de boucle

Renommer les extensions de fichiers

Voici un autre exemple d’utilisation de la boucle for pour renommer de fichiers avec l’extension jpeg en jpg.

for file in *.jpeg; do
    mv -- "$file" "${file%.jpeg}.jpg"
done

Bien sûr vous pouvez aussi utiliser la commande rename qui est plus rapide.

Créer une boucle infinie

Une boucle for peut également être infinie, ce qui est utile si vous voulez qu’un script continue à s’exécuter jusqu’à une interruption par CTRL+C ou kill, etc.

#!/bin/bash
for (( ; ; ))
do
   echo "Une boucle for infinie est en cours"
   sleep 1
done
La boucle for en bash Linux avec des exemples

Exemple pour arrêter plusieurs daemon/services

Imagions que vous administrez un serveur avec plusieurs versions de PHP-FPM.
Vous désirez dans un script arrêter toutes les serveurs PHP.
Vous pouvez utiliser la boucle for pour arrêter chacun des services

#!/bin/bash
php="php8.1-fpm php8.0-fpm php7.4-fpm"

echo "On arrête PHP"
for vphp in `echo $php`
do
       /etc/init.d/${vphp} stop
done

Utiliser une boucle for avec iptables

Pour créer plusieurs règles iptables identiques sur des adresses IP différents, vous pouvez utiliser une boucle For.
Par exemple pour autoriser des serveurs de monitoring OVH :

ovh="145.239.193.39 213.186.33.62 92.222.184.0/24 92.222.185.0/24 92.222.186.0/24 167.114.37.0/24 proxy.p19.ovh.net proxy.rbx.ovh.net proxy.sbg.ovh.net proxy.bhs.ovh.net ping.ovh.net proxy.ovh.net 51.91.118.250 51.91.118.251"
for ipovh in `echo $ovh`
do
        iptables -A INPUT -i $local -s $ipovh -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
        iptables -A OUTPUT -o $local -d $ipovh -m state --state ESTABLISHED,RELATED -j ACCEPT

        iptables -A INPUT -i $local -s $ipovh -m state --state ESTABLISHED,RELATED -j ACCEPT
        iptables -A OUTPUT -o $local -d $ipovh -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
done

Dans cet autre exemple, le script iptables permet d’autoriser les IP Cloudflare pour un serveur WEB.

echo "-- Creation des règles CloudFlare"
ipset destroy cf4
ipset create cf4 hash:net family inet
for ip in $(curl https://www.cloudflare.com/ips-v4); do ipset add cf4 $ip ; done
iptables -A INPUT -m set --match-set cf4 src -p tcp -m multiport --dports 80,443 -j ACCEPT
iptables -A OUTPUT -m set --match-set cf4 dst -p tcp -m multiport --sports 80,443 -j ACCEPT
iptables -A INPUT -m set --match-set cf4 src -p udp -m multiport --dports 443 -j ACCEPT
iptables -A OUTPUT -m set --match-set cf4 dst -p udp -m multiport --sports 443 -j ACCEPT

ip6tables -P INPUT DROP
ip6tables -P OUTPUT DROP
ip6tables -P FORWARD DROP
ipset destroy cf6
ipset create cf6 hash:net family inet6
for ip in `curl https://www.cloudflare.com/ips-v6`; do ipset add cf6 $ip ; done
ip6tables -A INPUT -m set --match-set cf6 src -p tcp -m multiport --dports 80,443 -j ACCEPT
ip6tables -A OUTPUT -m set --match-set cf6 dst -p tcp -m multiport --sports 80,443 -j ACCEPT
ip6tables -A INPUT -m set --match-set cf6 src -p udp -m multiport --dports 443 -j ACCEPT
ip6tables -A OUTPUT -m set --match-set cf6 dst -p udp -m multiport --sports 443 -j ACCEPT

Pour cela :

  • Il créé une table ipset puis les règles iptables qui vont bien.
  • La boucle for lit chaque adresse IP IPv4 contenue dans un fichier distant que l’on lit avec la commande curl
  • Puis on les ajoute dans la table ipset
  • Ensuite on créé les règles iptables pour autoriser les IP Cloudflare sur le port 80 (TCP), 443 (TCP/UDP)
  • On répète la même opération avec les IP en IPV6

Rupture conditionnelle avec sortie

Parfois avec la boucle for, nous pouvons avoir besoin de sortir lorsque des conditions données si elles se produisent.

L’instruction break met fin à la boucle en cours et transmet le contrôle du programme à l’instruction qui suit l’instruction terminée. Elle est généralement utilisée pour terminer la boucle lorsqu’une certaine condition est remplie.
Dans l’exemple suivant, nous utilisons l’instruction if pour terminer l’exécution de la boucle lorsque l’élément itéré actuel est égal à ‘Mercure’.

for planete in Mars Terre Mercure Jupiter; do
  if [[ "$planete" == 'Mercure' ]]; then
    break
  fi
  echo "Planète: $planete"
done
echo 'Fin!'
La boucle for en bash Linux avec des exemples

On peut aussi utiliser l’instruction exit pour interrompre l’itération.
Dans cet exemple, nous allons vérifier et si la valeur actuelle de c peut être divisée en 5, nous terminerons la boucle.

#!/bin/bash
for (( c=1; c<=10; c++ ))
do
   if(($c%5 == 0)) ; then
      exit

   fi

   echo "Boucle $c fois"
done
La boucle for en bash Linux avec des exemples

Utiliser l’instruction continue avec une boucle for

L’instruction continue quitte l’itération actuelle d’une boucle et transmet le contrôle du programme à l’itération suivante de la boucle.

Dans l’exemple suivant, nous itérons dans une plage de nombres. Lorsque l’élément itéré actuel est égal à ‘2’, l’instruction continue permet de revenir au début de la boucle et de poursuivre l’itération suivante :

for i in {1..5}; do
  if [[ "$i" == '2' ]]; then
    continue
  fi
  echo "Nombre: $i"
done
La boucle for en bash Linux avec des exemples

Inspecter les paramètres d’un script shell

Vous pouvez aussi inspecter les arguments d’un script bash.
Cela est utile pour afficher des erreurs.
La variable $* représente tous les paramètres de la ligne de commande passés au script.

Par exemple le script suivant va itérer les paramètres données à ce dernier :

for file in $*
do
  file "$file"
done

Ainsi si on exécute le script avec les paramètres, vous pouvez lire tous les fichiers avec l’extension txt, .sh ou commençant par ls :

./monscript.sh *.txt *.sh ls*
La boucle for en bash Linux avec des exemples

L’article La boucle for en bash Linux avec +10 exemples est apparu en premier sur malekal.com.

Enregistrer un commentaire

0 Commentaires