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.
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
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
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
Cela est strictement identique à :
for f in $(ls *.txt)
do
file $f ;
done
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
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!'
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
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
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*
Liens
L’article La boucle for en bash Linux avec +10 exemples est apparu en premier sur malekal.com.
0 Commentaires