Objectifs
- Utiliser la structure
casepour remplacer des chaînes deif/elif/elsecomplexes. - Appliquer des motifs (patterns) avec des jokers (
*,?,[]) pour des correspondances flexibles. - Gérer plusieurs valeurs pour un même bloc d’actions avec l’opérateur
|. - Construire des menus interactifs ou des routeurs de commandes lisibles.
Explications détaillées
Notions clés
La structure case est une alternative élégante et puissante à une longue série de if/elif/else lorsque vous avez besoin de tester une seule variable par rapport à plusieurs valeurs possibles.
Syntaxe de base
La structure se lit presque comme une phrase en anglais : “Dans le cas où $variable correspond à pattern1, faire ceci. Dans le cas où elle correspond à pattern2, faire cela…”
case "$variable" in
pattern1)
# Commandes à exécuter si $variable correspond à pattern1
;;
pattern2)
# Commandes pour pattern2
;;
*)
# Commandes par défaut, si aucun autre pattern ne correspond
;;
esac
case "$variable" in: Commence le bloc. La variable est citée.pattern): Définit une condition de correspondance.;;: Termine le bloc d’actions pour un pattern. C’est l’équivalent d’unbreak. Sans cela, le script continuerait d’évaluer les patterns suivants (un comportement rarement désiré).*): Le joker universel, qui intercepte toutes les valeurs qui n’ont pas correspondu aux patterns précédents. C’est leelsede la structurecase.esac: Marque la fin du bloccase.
La puissance des patterns
Le véritable avantage de case est que les “patterns” ne sont pas juste des valeurs exactes. Ils peuvent utiliser les mêmes jokers que pour la sélection de fichiers (globbing).
- Alternatives
|:[Oo]ui | [Yy]es): Correspond à “Oui”, “oui”, “Yes”, ou “yes”. - Jokers
*et?:*.txt): Correspond à n’importe quelle chaîne se terminant par.txt. - Classes de caractères
[]:[0-9]): Correspond à n’importe quel chiffre unique.
Syntaxe / Usages
# Exemple de base avec un routeur de commandes
COMMANDE="start"
case "$COMMANDE" in
start)
echo "Démarrage du service..."
;;
stop)
echo "Arrêt du service..."
;;
restart|reload)
echo "Redémarrage du service..."
;;
*)
echo "Usage: start|stop|restart" >&2
exit 1
;;
esac
Exemples
# 1. Analyser une réponse utilisateur
read -p "Voulez-vous continuer ? (O/n) " reponse
case "$reponse" in
[Oo] | [Oo][Uu][Ii] | "") # "" pour la réponse par défaut (juste Entrée)
echo "Continuation..."
;;
[Nn] | [Nn][Oo][Nn])
echo "Abandon."
exit 0
;;
*)
echo "Réponse non valide."
exit 1
;;
esac
# 2. Identifier un type de fichier par son extension
FICHIER="document.pdf"
case "$FICHIER" in
*.jpg | *.jpeg | *.png)
echo "C'est une image."
;;
*.txt | *.md)
echo "C'est un fichier texte."
;;
*.zip | *.tar.gz)
echo "C'est une archive."
;;
*)
echo "Type de fichier non reconnu."
;;
esac
Bonnes pratiques
- Utilisez
casedès que vous avez une cascade deif/elifqui teste la même variable. Le code sera plus propre et souvent plus facile à maintenir. - Toujours inclure un cas par défaut
*)pour gérer les entrées inattendues et éviter un comportement silencieux en cas d’erreur. - Citez toujours la variable en entrée (
case "$VAR" in) pour éviter les problèmes avec les valeurs vides ou contenant des espaces. - Gardez les blocs d’action courts. Si un cas devient complexe, appelez une fonction.
Pièges courants
- Oublier
;;: C’est l’erreur la plus fréquente. Si vous oubliez le double point-virgule, l’exécution “tombe” dans le bloc suivant, ce qui peut avoir des conséquences inattendues. - Oublier
esac: Chaquecasedoit être fermé paresac. - L’ordre des patterns compte :
cases’arrête au premier pattern qui correspond. Si vous mettez*)au début, il interceptera tout. Mettez toujours les cas les plus spécifiques en premier.
Exercices
-
Script de salutation :
- Écrivez un script qui prend l’heure actuelle (juste l’heure, de 0 à 23) avec
date +%H. - Utilisez une structure
casepour afficher :- “Bonne matinée” (de 6h à 11h)
- “Bon appétit” (de 12h à 13h)
- “Bon après-midi” (de 14h à 17h)
- “Bonne soirée” (pour les autres cas)
- Écrivez un script qui prend l’heure actuelle (juste l’heure, de 0 à 23) avec
-
Routeur de script :
- Créez un script
manage.shqui accepte un seul argument :deploy,test, oulint. - Pour chaque argument, le script doit simplement afficher “Déploiement en cours…”, “Lancement des tests…”, etc.
- Si l’argument est inconnu, il doit afficher un message d’aide et quitter avec un code d’erreur.
- Créez un script
-
Vérificateur de voyelle/consonne :
- Écrivez un script qui prend une seule lettre en argument.
- Il doit utiliser
casepour déterminer si c’est une voyelle (majuscule ou minuscule), une consonne, ou un chiffre. (Indice : les patterns peuvent utiliser des classes de caractères comme[a-z]).