case

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
$

Etiquettes: