Les structures de contrôle, également connues sous le nom de « boucles » et « conditions », sont des éléments essentiels dans le domaine de la programmation, y compris dans le contexte des scripts shell. Dans cette exploration approfondie du sujet, nous aborderons divers aspects de l’utilisation des structures de contrôle dans les scripts shell, en mettant l’accent sur les deux types principaux : les boucles et les conditions.
Commençons par les structures conditionnelles. Dans un script shell, les conditions sont utilisées pour prendre des décisions en fonction de l’évaluation d’une expression. La structure de contrôle conditionnelle la plus fondamentale est l’instruction « if ». Elle permet d’exécuter un bloc de code si une condition donnée est vraie. Voici un exemple simple :

bash#!/bin/bash
# Déclaration d'une variable
age=25
# Utilisation de l'instruction if pour évaluer une condition
if [ $age -ge 18 ]; then
echo "Personne majeure."
else
echo "Personne mineure."
fi
Dans cet exemple, la condition évaluée est si l’âge est supérieur ou égal à 18. Si c’est le cas, le script affiche « Personne majeure », sinon il affiche « Personne mineure ». L’utilisation de crochets ([ ]
) est une manière courante de faire des comparaisons dans les scripts shell.
Outre l’instruction « if », il existe également l’instruction « elif » qui permet de gérer plusieurs conditions de manière séquentielle. Cela peut être utile lorsque vous avez plusieurs scénarios à prendre en compte. Voici un exemple :
bash#!/bin/bash
# Déclaration d'une variable
note=75
# Utilisation de l'instruction if avec elif pour évaluer plusieurs conditions
if [ $note -ge 90 ]; then
echo "Excellent"
elif [ $note -ge 80 ]; then
echo "Très bien"
elif [ $note -ge 70 ]; then
echo "Bien"
else
echo "À améliorer"
fi
Dans cet exemple, le script évalue la note et affiche un message en fonction de l’intervalle dans lequel la note se trouve.
Passons maintenant aux boucles. Les boucles permettent de répéter l’exécution d’un bloc de code tant qu’une condition spécifiée est vraie. La boucle « for » est souvent utilisée pour parcourir des listes d’éléments. Voici un exemple :
bash#!/bin/bash
# Utilisation de la boucle for pour parcourir une liste d'éléments
for fruit in pomme poire banane orange; do
echo "J'aime la $fruit."
done
Dans cet exemple, la boucle « for » parcourt la liste des fruits et affiche un message pour chaque fruit.
Une autre boucle couramment utilisée est la boucle « while ». Cette boucle continue d’exécuter un bloc de code tant qu’une condition spécifiée est vraie. Voici un exemple illustrant son utilisation :
bash#!/bin/bash
# Déclaration d'une variable
compteur=1
# Utilisation de la boucle while pour répéter une action
while [ $compteur -le 5 ]; do
echo "C'est la ligne numéro $compteur."
((compteur++))
done
Dans cet exemple, la boucle « while » affiche un message tant que le compteur est inférieur ou égal à 5.
Les boucles peuvent également être utilisées avec des commandes conditionnelles pour créer des structures de contrôle plus complexes. Voici un exemple combinant une boucle « for » avec une condition « if » :
bash#!/bin/bash
# Utilisation d'une boucle for avec une condition if
for i in {1..10}; do
if [ $((i % 2)) -eq 0 ]; then
echo "$i est un nombre pair."
else
echo "$i est un nombre impair."
fi
done
Dans cet exemple, la boucle « for » parcourt les nombres de 1 à 10, et à chaque itération, une condition « if » est utilisée pour déterminer si le nombre est pair ou impair.
Il est également important de mentionner l’utilisation des commandes de contrôle de boucle telles que « break » et « continue ». « Break » est utilisé pour sortir d’une boucle prématurément, tandis que « continue » est utilisé pour passer à l’itération suivante de la boucle. Ces commandes offrent un contrôle plus fin sur le flux d’exécution d’un script.
En conclusion, les structures de contrôle sont des éléments fondamentaux dans la création de scripts shell complexes et efficaces. Que ce soit pour prendre des décisions en fonction de conditions spécifiques ou pour répéter des actions à travers des boucles, la maîtrise de ces concepts est essentielle pour tout développeur ou administrateur système travaillant dans un environnement Unix/Linux. En explorant ces concepts de manière approfondie et en les appliquant dans des scénarios variés, il est possible d’optimiser la logique des scripts shell, contribuant ainsi à des workflows automatisés plus robustes et efficaces.
Plus de connaissances
Dans la continuité de notre exploration des structures de contrôle dans les scripts shell, examinons de manière approfondie certaines fonctionnalités avancées et stratégies pertinentes qui enrichissent la puissance de ces scripts.
1. Cas particuliers des conditions complexes :
Dans les scripts shell, les conditions peuvent parfois devenir complexes, impliquant des opérateurs logiques tels que « && » (ET logique) et « || » (OU logique). Ces opérateurs permettent de construire des conditions combinées, comme illustré ci-dessous :
bash#!/bin/bash
# Utilisation d'opérateurs logiques dans une condition
age=22
ville="Paris"
if [ $age -ge 18 ] && [ $ville == "Paris" ]; then
echo "Personne majeure résidant à Paris."
else
echo "Autre cas."
fi
Dans cet exemple, la condition vérifie à la fois si l’âge est supérieur ou égal à 18 et si la personne réside à Paris.
2. Fonctions dans les scripts shell :
Intégrer des fonctions dans les scripts shell est une pratique courante pour rendre le code plus modulaire et lisible. Les fonctions permettent de regrouper des blocs de code spécifiques et de les réutiliser à différents endroits du script. Voici un exemple illustrant la définition et l’utilisation d’une fonction :
bash#!/bin/bash
# Définition d'une fonction
afficher_message() {
echo "Bonjour, $1 !"
}
# Appel de la fonction avec un argument
afficher_message "John"
Cette approche contribue à la maintenabilité du code en évitant la duplication et en organisant logiquement les différentes parties du script.
3. Le cas de la substitution de commandes :
Les scripts shell permettent la substitution de commandes, une technique permettant d’attribuer le résultat d’une commande à une variable. Cela s’avère particulièrement utile dans des scénarios où la sortie d’une commande est nécessaire pour une opération ultérieure. Un exemple concret serait le stockage de la date actuelle dans une variable :
bash#!/bin/bash
# Substitution de commande pour obtenir la date actuelle
date_actuelle=$(date +"%Y-%m-%d")
echo "La date actuelle est : $date_actuelle"
La variable date_actuelle
contiendra la date formatée selon le motif spécifié dans la commande date
.
4. Traitement des options en ligne de commande :
Pour augmenter la flexibilité des scripts shell, la gestion des options en ligne de commande est cruciale. Le programme getopts
facilite cette tâche en permettant de traiter des options et des arguments de manière structurée. L’exemple suivant montre comment utiliser getopts
:
bash#!/bin/bash
# Traitement des options en ligne de commande
while getopts ":a:b:" opt; do
case $opt in
a)
echo "Option -a avec argument : $OPTARG"
;;
b)
echo "Option -b avec argument : $OPTARG"
;;
\?)
echo "Option invalide: -$OPTARG"
;;
esac
done
Dans ce script, les options -a
et -b
peuvent être utilisées avec des arguments.
5. Manipulation de chaînes de caractères :
La manipulation de chaînes de caractères est une compétence précieuse dans les scripts shell. Les opérations de découpage, de concaténation et de substitution peuvent être réalisées à l’aide d’outils tels que les crochets et les expressions régulières. Voici un exemple illustrant la découpe d’une chaîne :
bash#!/bin/bash
# Manipulation de chaînes de caractères
nom_complet="John Doe"
prenom=${nom_complet%% *}
nom=${nom_complet#* }
echo "Prénom : $prenom"
echo "Nom : $nom"
Dans cet exemple, le prénom et le nom sont extraits d’une chaîne complète.
6. Gestion des erreurs et des exceptions :
La gestion des erreurs est cruciale dans tout script robuste. L’utilisation de l’instruction trap
permet de définir des actions à effectuer lorsqu’une erreur survient. Voici un exemple :
bash#!/bin/bash
# Gestion des erreurs avec trap
trap 'echo "Une erreur est survenue !"; exit 1' ERR
# Simulation d'une erreur
commande_inexistante
Lorsque la commande commande_inexistante
est exécutée, l’instruction trap
intercepte l’erreur et affiche un message spécifique.
7. Les tableaux :
Les tableaux offrent une manière structurée de stocker et manipuler plusieurs valeurs dans un seul élément. Voici un exemple montrant la déclaration et l’utilisation d’un tableau :
bash#!/bin/bash
# Déclaration et utilisation d'un tableau
fruits=("pomme" "poire" "banane" "orange")
# Accéder à un élément du tableau
echo "Le premier fruit est ${fruits[0]}"
# Ajouter un élément au tableau
fruits+=(kiwi)
# Parcourir tous les éléments du tableau
for fruit in "${fruits[@]}"; do
echo "J'aime la $fruit."
done
Les tableaux facilitent la gestion de collections de données dans les scripts shell.
En synthèse, l’utilisation avancée des structures de contrôle, la création de fonctions, la gestion des options en ligne de commande, la manipulation de chaînes de caractères, la gestion des erreurs, et l’utilisation de tableaux sont autant de techniques qui élèvent la qualité et la complexité des scripts shell. En intégrant ces concepts de manière judicieuse, les développeurs peuvent créer des scripts shell puissants et flexibles, adaptés à une variété de tâches dans les environnements Unix/Linux.