La structure de controle case permet elle aussi d'effectuer des tests.
Elle permet d'orienter la suite du programme en fonction d'un choix de différentes valeurs.
Quand il y a un nombre important de choix, la commande case est plus appropriée que la commande if.
Syntaxe :
case $variable in
modele1) commande1
...
;;
modele2) commande2
...
;;
modele3 | modele4 | modele5 ) commande3
...
;;
esac
Le shell compare la valeur de la variable aux différents modèle renseignés.
Lorsque la valeur correspond au modèle, les commandes faisant partie du bloc sont exécutées.
Les caractères ;; permettent de fermer le bloc et de mettre fin au case.
Le shell continue à la première commande située sous esac.
Il ne faut surtout pas oublier les caractères ;; car cela engendrera une erreur.
Rappel des caractères spéciaux :
Caractères spéciaux pour modèles de chaines de caractères | Signification |
---|---|
Caractères spéciaux valables dans tous les shells : | |
* | 0 à n caractères |
? | 1 caractère quelconque |
[abc] | 1 caractère parmis ceux inscrits entre les crochets |
[!abc] | 1 caractère ne faisant pas partie de ceux inscrits entre les crochets |
Caractères spéciaux non valides en Bourne Shell. En bash, il faut activer l'option extglob (shopt -s extglob) |
|
?(expression) | de 0 à 1 fois l'expression |
*(expression) | de 0 à n fois l'expression |
+(expression) | de 1 à n fois l'expression |
@(expression) | 1 fois l'expression |
!(expression) | 0 fois l'expression |
?(expression1 | expression2 | ...) *(expression1 | expression2 | ...) +(expression1 | expression2 | ...) @(expression1 | expression2 |...) !(expression1 | expression2 | ...) |
alternatives |
Exemple :
Le script suivant permet de créer, modifier, visualiser et supprimer un fichier dans le répertoire d'exécution du script.
Il prend en argument un nom de fichier et affiche un menu.
Utilisation de case avec imbrication de if.
$ nl file.sh
1 #!/bin/bash
2 #set -x
3 # Si le nombre d'arguments est different de 1 on quitte avec code 1
4 if [[ $# -ne 1 ]]
5 then
6 echo "Nombre d'arguments incorrect"
7 echo "Usage : $0 file"
8 exit 1
9 fi
10 # On affiche le menu
11 echo -e "1(Creer) "
12 echo -e "2(Editer) "
13 echo -e "3(Afficher) "
14 echo -e "4(Supprimer)"
15 echo -e "Votre choix : \c"
16 # On recupere la valeur saisi
17 read choix
18 # Si la valeur saisi est differente de 1, 2, 3 ou 4 on quitte avec code 1
19 if [[ "$choix" != [1-4] ]]
20 then
21 echo "Choix incorrect"
22 exit 1
23 fi
24 # En fonction de la valeur saisi on execute les differentes actions
25 case "$choix" in
26 # Si choix = 1 --> creation
27 1) if [[ -e "$1" ]]
28 then
29 if [[ -f "$1" ]]
30 then
31 echo "Fichier $1 deja existant"
32 elif [[ -d "$1" ]]
33 then
34 echo "$1 est un repertoire"
35 fi
36 exit 1
37 else
38 touch "$1"
39 nano "$1"
40 fi
41 ;;
42 # Si choix = 2 --> edition
43 2) if [[ -f "$1" ]]
44 then
45 nano "$1"
46 else
47 if [[ -d "$1" ]]
48 then
49 echo "$1 est un repertoire et ne peut etre edite"
50 else
51 echo "Fichier $1 inexistant"
52 fi
53 exit 1
54 fi
55 ;;
56 # Si choix = 3 --> affichage
57 3) if [[ -f "$1" ]]
58 then
59 more "$1"
60 else
61 if [[ -d "$1" ]]
62 then
63 echo "$1 est un repertoire et ne peut etre visualise"
64 else
65 echo "Fichier $1 inexistant"
66 fi
67 exit 1
68 fi
69 ;;
70 # Si choix = 4 --> suppression
71 4) if [[ -f "$1" ]]
72 then
73 rm "$1"
74 else
75 if [[ -d "$1" ]]
76 then
77 echo "$1 est un repertoire et ne peut etre supprime"
78 else
79 echo "Fichier $1 inexistant"
80 fi
81 exit 1
82 fi
83 ;;
84 # Fin du case
85 esac
86 # Tout c'est bien deroule on quitte avec le code 0
87 exit 0
$ ./file.sh test4
1(Creer)
2(Editer)
3(Afficher)
4(Supprimer)
Votre choix : 1
$