Chapitre 8. Structures de contrôle case et while

Table des matières

8.1. Choix multiple case
8.2. Itération while

8.1. Choix multiple case

Syntaxe :

case mot in

[ modèle [ | modèle ] ... ) suite_de_commandes ;; ] ...

esac

Le shell évalue la valeur de mot puis compare séquentiellement cette valeur à chaque modèle. Dès qu'un modèle correspond à la valeur de mot, la suite de commandes associée est exécutée, terminant l'exécution de la commande interne composée case.

Les mots case et esac sont des mots-clé ; cela signifie que chacun d’eux doit être le premier mot d’une commande.

suite_de_commandes doit se terminer par deux caractères point-virgule collés, de manière à ce qu’il n’y ait pas d’ambiguïté avec l’enchaînement séquentiel de commandes cmd1 ; cmd2.

Un modèle peut être construit à l’aide des caractères et expressions génériques de bash [cf. Chapitre 4, Caractères et expressions génériques]. Dans ce contexte, le symbole | signifie OU.

Pour indiquer le cas par défaut, on utilise le modèle *. Ce modèle doit être placé à la fin de la structure de contrôle case.

Le code de retour de la commande composée case est égal à 0 si aucun modèle n’a pu correspondre à la valeur de mot. Sinon, c’est celui de la dernière commande exécutée de suite_de_commandes.

  • Exemple 1 : programme shell oui affichant OUI si l’utilisateur a saisi le caractère o ou O

    #!/bin/bash
    
    #@(#)oui
    
    read –p ″Entrez votre réponse : ″  rep
    case $rep in
    o|O ) echo OUI ;;
    *)    echo Indefini
    esac

    Remarques :

    • une substitution (de paramètre, de commande ou autre) doit être présente après le mot-clé case (caractère $)

    • il n’est pas obligatoire de terminer la dernière suite_de_commandes par ;;

  • Exemple 2 : programme shell nombre prenant une chaîne de caractères en argument et qui affiche cette chaîne si elle est constituée d’une suite de chiffres. Aucune vérification n’est effectuée sur le nombre d’arguments passés au programme.

    #!/bin/bash
    #@(#)nombre
    
    shopt -s extglob
    case $1 in
    +([[:digit:]]) ) echo ″$1 est une suite de chiffres″ ;;
    esac

    Rq : pour que les expressions génériques puissent être traitées dans un fichier shell, il est nécessaire d’activer l’option correspondante (shopt -s extglob).



Ignorer la casse : Si l’on souhaite ne pas distinguer majuscules et minuscules lors de la comparaison avec les modèles, il suffit de positionner l’option nocasematch de la commande interne shopt.

Soit le fichier shell OUI :

	#!/bin/bash
	#	@(#)	OUI	

	read -p "Entrez un mot : "  mot

	shopt -s nocasematch
	case $mot in
	 oui ) echo "Vous avez saisi le mot oui" ;;
	 * )  echo "$mot n'est pas le mot oui" ;;
	esac

Ce programme shell reconnait le mot oui, écrit avec des majuscules ou des minuscules.

$ OUI
Entrez un mot : Oui
Vous avez saisi le mot oui
$ 
$ OUI
Entrez un mot : aoui
aoui n'est pas le mot oui
$ 
$ OUI
Entrez un mot : oUI
Vous avez saisi le mot oui
$

Remarque : il ne faut pas confondre les options nocasematch et nocaseglob. L'option nocasematch ne traite pas la casse lors de l'exécution des commandes internes case et [[ [cf. Chapitre 11, Entiers et expressions arithmétiques] tandis que l'option nocaseglob ne traite pas la casse lors de la génération des noms d'entrées [cf. Chapitre 4, Caractères et expressions génériques].