2011-04-06 18 views
98

Estoy buscando la sintaxis correcta de la instrucción switch con casos fallthrough en Bash (idealmente insensible a mayúsculas y minúsculas). En PHP me programo se siente:¿Cambiar la caja con caída?

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

quiero lo mismo en Bash:

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

Esto de alguna manera no funciona: la función do_what_you_are_supposed_to_do() debe ser despedido cuando C $ es 2 ó 3.

+2

No utilice las funciones de llamada con parens !!! Como puede definir una función en bash usando 'function fname {echo" Inside fname "; return 0; } 'o' fname() {echo "dentro de fname"; return 0; } 'colocar parens en una llamada a función puede parecer una definición de función. Las funciones se deben llamar como cualquier otro programa de línea de comando, como 'mv',' cp', 'rsync',' ls', 'cd', etc ... En este caso llamamos a fname like así:' fname $ ARGS' . –

+0

'do_nothing()' ¿será una instrucción SKIP? Use ':'. – sjas

Respuesta

176

Utilice una barra vertical (|) para "o".

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

O en este caso simple, una clase de caracteres '[23])' – SiegeX

22
  • No utilice () detrás de los nombres de función en bash a menos que como para definirlos.
  • uso [23] en el caso de que coincida 2 o 3
  • casos de cuerdas estáticas deben estar encerrados por '' en lugar de ""

Si encerrado en "", el intérprete (innecesariamente) trata de ampliar las posibles variables en el valor antes de hacer coincidir

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

Para el caso coincidencia insensible, se pueden utilizar las clases de personaje (como [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 

Pero abra no golpeó en cualquier momento, ya que se corresponde con el primer caso.

Si es necesario, puede omitir ;; en el primer caso para continuar probando las coincidencias en los siguientes casos. (;; salta a esac)

+0

También puede convertir C en minúscula 'case" $ {C ,,} "en' si el caso no es importante – Sprinterfreak

+0

¿Qué sucede si omite el ';;'? ¿No se supone que debes usar '; &' para Fallthrough? – HelloGoodbye

+0

Recibo un error de sintaxis si omito ';;' Necesito usar ';; &' si deseo continuar la prueba. – Jasen

45

recientes bash versiones permiten caída-through usando ;& en lugar de ;;: sino que también permiten la reanudación de los controles de casos mediante el uso de ;;& allí.

for n in 4 14 24 34 
do 
    echo -n "$n = " 
    case "$n" in 
    3?) 
    echo -n thirty- 
    ;;& #resume (to find ?4 later) 
    "24") 
    echo -n twenty- 
    ;& #fallthru 
    "4" | ?4) 
    echo -n four 
    ;;& # resume (to find teen where needed) 
    "14") 
    echo -n teen 
    esac 
    echo 
done 

ejemplo de salida

4 = four 
14 = fourteen 
24 = twenty-four 
34 = thirty-four 
8

Prueba esto:

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

que es un consejo muy útil. Al menos para Bash 4.3.11. No me molesté en probarlo en ningún otro. – Daniel

+0

¡Gracias, gracias, gracias! –

+1

Nota: Esto no funciona para bash 3.2, que sigue siendo el bash predeterminado en macOS. –

Cuestiones relacionadas