10.4. Tests et branchements

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

case (in) / esac

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

[Note]

Note

  • 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).

Exemple 10.24. Utiliser case

&ex29;

Exemple 10.25. Créer des menus en utilisant case

&ex30;

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.

Exemple 10.26. Utiliser la substitution de commandes pour générer la variable case

&casecmd;

Une construction avec case peut filtrer les chaînes sur des paramètres de remplacement.

Exemple 10.27. Simple correspondance de chaîne

&matchstring;

Exemple 10.28. Vérification d'une entrée alphabétique

&isalpha;

select

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é.

Exemple 10.29. Créer des menus en utilisant select

&ex31;

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.

Exemple 10.30. Créer des menus en utilisant select dans une fonction

&ex32;

Voir aussi l'Exemple 34.3, « Simple application de base de données, utilisant les références de variables indirectes ».