Unix / Linux Shell - Le cas ... Déclaration esac

Vous pouvez utiliser plusieurs if...elifinstructions pour effectuer une branche multi-voies. Cependant, ce n'est pas toujours la meilleure solution, surtout lorsque toutes les branches dépendent de la valeur d'une seule variable.

Shell prend en charge case...esac qui gère exactement cette situation, et il le fait plus efficacement que des instructions if ... elif répétées.

Syntaxe

La syntaxe de base du case...esac instruction consiste à donner une expression à évaluer et à exécuter plusieurs instructions différentes en fonction de la valeur de l'expression.

L'interpréteur vérifie chaque cas par rapport à la valeur de l'expression jusqu'à ce qu'une correspondance soit trouvée. Si rien ne correspond, une condition par défaut sera utilisée.

case word in
   pattern1)
      Statement(s) to be executed if pattern1 matches
      ;;
   pattern2)
      Statement(s) to be executed if pattern2 matches
      ;;
   pattern3)
      Statement(s) to be executed if pattern3 matches
      ;;
   *)
     Default condition to be executed
     ;;
esac

Ici, le mot de chaîne est comparé à chaque modèle jusqu'à ce qu'une correspondance soit trouvée. La ou les instructions suivant le modèle correspondant s'exécutent. Si aucune correspondance n'est trouvée, l'instruction case se ferme sans effectuer aucune action.

Il n'y a pas de nombre maximum de motifs, mais le minimum est un.

Lorsque la partie instruction (s) s'exécute, la commande ;; indique que le déroulement du programme doit sauter à la fin de l'instruction de cas entière. Ceci est similaire à une rupture dans le langage de programmation C.

Exemple

#!/bin/sh

FRUIT="kiwi"

case "$FRUIT" in
   "apple") echo "Apple pie is quite tasty." 
   ;;
   "banana") echo "I like banana nut bread." 
   ;;
   "kiwi") echo "New Zealand is famous for kiwi." 
   ;;
esac

Lors de l'exécution, vous recevrez le résultat suivant -

New Zealand is famous for kiwi.

Une bonne utilisation d'une instruction case est l'évaluation des arguments de ligne de commande comme suit -

#!/bin/sh

option="${1}" 
case ${option} in 
   -f) FILE="${2}" 
      echo "File name is $FILE"
      ;; 
   -d) DIR="${2}" 
      echo "Dir name is $DIR"
      ;; 
   *)  
      echo "`basename ${0}`:usage: [-f file] | [-d directory]" 
      exit 1 # Command to come out of the program with status 1
      ;; 
esac

Voici un exemple d'exécution du programme ci-dessus -

$./test.sh
test.sh: usage: [ -f filename ] | [ -d directory ]
$ ./test.sh -f index.htm
$ vi test.sh
$ ./test.sh -f index.htm
File name is index.htm
$ ./test.sh -d unix
Dir name is unix
$
unix-decision-making.htm