225 votes

Commutateur cas avec fallthrough?

Je suis à la recherche pour le droit de la syntaxe de l'instruction switch avec fallthrough cas de Bash (le meilleur si il est insensible à la casse). En PHP je programme comme:

switch($c) {
    case 1:
        do_this();
        break;
     case 2:
     case 3:
        do_what_you_are_supposed_to_do();
        break;
     default:
        do_nothing(); 
}

Je veux le même dans Bash:

case "$C" in
    "1")
        do_this()
        ;;
    "2")
    "3")
        do_what_you_are_supposed_to_do()
        ;;
    *)
        do_nothing();
        ;; 
esac

Ce en quelque sorte ne fonctionne pas: la fonction do_what_you_are_supposed_to_do() doit être déclenché lorsque $C est 2 OU 3.

361voto

geekosaur Points 26170

L'utilisation d'une barre verticale "ou".

case "$C" in
"1")
    do_this()
    ;;
"2" | "3")
    do_what_you_are_supposed_to_do()
    ;;
*)
    do_nothing()
    ;;
esac

126voto

Jasen Points 247

les récentes versions de bash permettre fallthru par l'aide ;& au lieu de ;;

n=24
case "$n" in
 "24" )
   echo -n twenty-
   ;&   #fallthru
 "4" )
   echo four 
   ;;
esac;

30voto

Sprinterfreak Points 61
  • Ne pas utiliser () derrière les noms de fonction dans bash sauf si vous aimez les définir.
  • utiliser [23] en cas de match 2 ou 3
  • static string cas, doit être joint en '' au lieu de ""

Si clos en "", l'interprète (inutilement) essaye de développer les variables de la valeur avant d'appariement.

case "$C" in
'1')
    do_this
    ;;
[23])
    do_what_you_are_supposed_to_do
    ;;
*)
    do_nothing
    ;;
esac

Pour la correspondance insensible à la casse, vous pouvez utiliser les classes de caractères (comme [23]):

case "$C" in

# will match C='Abra' and C='abra'
[Aa]'bra')
    do_mysterious_things
    ;;

# will match all letter cases at any char like `abra`, `ABRA` or `AbRa`
[Aa][Bb][Rr][Aa])
    do_wild_mysterious_things
    ;;

esac

Mais abra n'ai pas touché à tout moment, car il va être compensée par le premier cas.

Si nécessaire, vous pouvez omettre ;; dans le premier cas, de poursuivre les essais pour les matches dans les cas suivants. (;; sauts d' esac)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X