2012-08-17 12 views
41

En los lenguajes imperativos populares, las sentencias de conmutación generalmente "caen" al siguiente nivel una vez que se ha emparejado una declaración de caso.Declaración de caso fallthrough?

Ejemplo:

int a = 2; 
switch(a) 
{ 
    case 1: 
     print "quick "; 
    case 2: 
     print "brown "; 
    case 3: 
     print "fox "; 
     break; 
    case 4: 
     print "jumped "; 
} 

imprimiría "zorro marrón".

Sin embargo, el mismo código en bash

A=2 
case $A in 
2) 
    echo "QUICK" 
    ;& 
2) 
    echo "BROWN" 
    ;& 
3) 
    echo "FOX" 
    ;& 
4) 
    echo "JUMPED" 
    ;& 
esac 

sólo se imprime "BROWN"

¿Cómo hacer que la declaración de caso en bash "caen a través" de las condiciones restantes como el primer ejemplo?

(edit: Bash versión 3.2.25, la, declaración & (from wiki) da lugar a un error de sintaxis)

en marcha:

test.sh:

#!/bin/bash 
A=2 
case $A in 
1) 
    echo "QUICK" 
    ;& 
2) 
    echo "BROWN" 
    ;& 
3) 
    echo "FOX" 
    ;& 
esac 

Da:

./test.sh: línea 6: error de sintaxis cerca del token inesperado ;' ./test.sh:
line 6:
; & '

+0

error Agregado para; & – Resorath

+0

Relacionados (pero no duplicar) pregunta: [Switch case with fallthrough?] (Http://stackoverflow.com/q/5562253) (con respecto al operador '|' para separar múltiples patrones en una expresión 'case '). – TachyonVortex

Respuesta

27

Los ;& y ;;& operadores fueron introducidos en bash 4.0, así que si quieres seguir con una versión de cinco años de fiesta, ya sea que usted tenga que repetir código o usar if s.

if ((a == 1)); then echo quick; fi 
if ((a > 0 && a <= 2)); then echo brown; fi 
if ((a > 0 && a <= 3)); then echo fox; fi 
if ((a == 4)); then echo jumped; fi 

o encuentre otra forma de lograr el objetivo real. (.. En una nota lateral, don't use all uppercase variable names Corre el riesgo de sobrescribir las variables de shell especiales o variables de entorno)

+0

O use las funciones para no repetir una gran cantidad de código. –

+0

Nota interesante sobre la versión bash. – Resorath

+0

¡Guau! Gracias, ahora veo que mi 'nueva' MacBookPro 2012 tiene una Bash muy antigua de 2007: GNU bash, versión 3.2.48 (1) -lanzamiento (x86_64-apple-darwin12) – AnneTheAgile

17

Prueba esto:

case $VAR in 
normal) 
    echo "This doesn't do fallthrough" 
    ;; 
fallthrough) 
    echo -n "This does " 
    ;& 
somethingelse) 
    echo "fall-through" 
    ;; 
esac 
+2

Gracias por la información. Sin embargo, cambiaría el "nombre" del tercer caso, p. a 'somethingElse'. – fotNelton

Cuestiones relacionadas