Les constructions case et select ne sont pas techniquement des boucles puisqu' elles n'exécutent pas un bloc de code de façon itérative. Néanmoins, comme les boucles, elles orientent le flot d'exécution du programme suivant certaines conditions au début ou à la fin du bloc.
Contrôler le flot du programme dans un bloc de code
La syntaxe avec case est l'équivalent en shell de switch en C/C++. Elle permet le branchement vers l'un parmi plusieurs blocs de code, d'après des tests conditionnels. Elle agit comme une espèce de raccourcis pour de multiples instructions if/then/else et c'est un outil approprié pour la création de menus.
case "$variable" in
"$condition1" )
commande...
;;
"$condition2" )
commande...
;;
esac
Protéger les variables n'est pas obligatoire car la séparation de mots n'est pas effective.
Chaque ligne de test se termine par une parenthèse droite ).
Chaque bloc conditionnel de termine par un double point virgule ;;.
Si une condition est vraie, alors la commande associée s'exécute et le bloc case prend fin.
Le bloc case tout entier se termine par un esac (case épelé à l'envers).
Une utilisation exceptionnellement intelligente de case concerne le test des paramètres de ligne de commande.
#! /bin/bash case "$1" in "") echo "Usage: ${0##*/} <nomfichier>"; exit $E_PARAM;; # Pas de paramètres en lignes de commande #+ ou premier paramètre vide. # Notez que ${0##*/} est la substitution de paramètres ${var##modèle}. # Le résultat net est $0. -*) NOMFICHIER=./$1;; # Si le nom de fichier passé en premier argument ($1) #+ commence avec un tiret, #+ le remplacez par ./$1 #+ pour que les commandes suivants ne l'interprètent pas #+ comme une option. * ) NOMFICHIER=$1;; # Sinon, $1. esac
Voici un exemple plus direct de gestion de paramètres en ligne de commande :
#! /bin/bash while [ $# -gt 0 ]; do # Jusqu'à la fin des paramètres... case "$1" in -d|--debug) # paramètre "-d" ou "--debug" ? DEBUG=1 ;; -c|--conf) CONFFILE="$2" shift if [ ! -f $CONFFILE ]; then echo "Erreur : le fichier indiqué n'existe pas !" exit $E_FICHIERCONF # Erreur pour un fichier inexistant. fi ;; esac shift # Vérifiez le prochain ensemble de paramètres. done # À partir du script "Log2Rot" de Stefano Falsetto, #+ faisant partie de son paquetage "rottlog". # Utilisé avec sa permission.
Une construction avec case peut filtrer les chaînes sur des paramètres de remplacement.
La construction select, adoptée du Korn Shell, est encore un autre outil pour construire les menus.
select variable [in liste]
do
commande...
break
done
Ceci demande à l'utilisateur d'entrer un des choix présentés dans la variable liste. Notez que select utilise l'invite $PS3 (#? ) par défaut mais que ceci peut être changé.
Si on omet une liste in, alors select utilise la liste des arguments en ligne de commandes ($@) passée au script ou à la fonction dans lequel la construction select est intégrée.
Comparez ceci avec le comportement de la construction
for variable [in liste]
avec in liste omis.
Voir aussi l'Exemple 34.3, « Simple application de base de données, utilisant les références de variables indirectes ».