¿Es posible hacer coincidir varias condiciones en una declaración de caso?

¿Es posible hacer coincidir varias condiciones en una declaración de caso?

Me gustaría hacer algo como esto donde el viernes, el resultado sea para ambas condiciones que coincidan:

#!/bin/bash

#!/bin/bash
NOW=$(date +"%a")
case $NOW in
    Mon)
        echo "Mon";;
    Tue|Wed|Thu|Fri)
        echo "Tue|Wed|Thu|Fri";;
    Fri|Sat|Sun)
        echo "Fri|Sat|Sun";;
    *) ;;
esac

Tal como está escrito el código anterior, el único resultado del viernes sería:

Martes|Miércoles|Jueves|Viernes

Salida deseada el viernes:

Mar|Miércoles|Jueves|Viernes Vie
|Sábado|Dom

Entiendo que normalmente,sólo los comandos correspondientes al primer patrónque coincida con la expresión se ejecutan.

¿Existe alguna forma de ejecutar comandos para patrones coincidentes adicionales?

EDITAR: No estoy buscandocomportamiento de caída, pero también es bueno saberlo. Gracias conductor de acero.

Respuesta1

Puedes usar la ;;&conjunción. De man bash:

               Using ;;& in place of ;; causes the shell to test
the next pattern list in the statement, if any, and execute  any
associated  list on a successful match.

Ex. dado

$ cat myscript 
#!/bin/bash
NOW=$(date -d "$1" +"%a")
case $NOW in
    Mon)
        echo "Mon";;
    Tue|Wed|Thu|Fri)
        echo "Tue|Wed|Thu|Fri";;&
    Fri|Sat|Sun)
        echo "Fri|Sat|Sun";;
    *) ;;
esac

entonces

$ ./myscript thursday
Tue|Wed|Thu|Fri

$ ./myscript friday
Tue|Wed|Thu|Fri
Fri|Sat|Sun

$ ./myscript saturday
Fri|Sat|Sun

Para obtener más información (incluidos equivalentes en otros shells), consulte

Respuesta2

No, la estructura básica de una declaración de caso es que solo se ejecuta un segmento coincidente. Excepto por el fracaso que usted rechaza. Además, solo funciona en algunos shells, no en todos, y tiene una sintaxis específica para cada shell. La sintaxis de Bash para la falla es ;;&. En ksh o zsh, el único disponible ;&no realiza la siguiente prueba, solo ejecuta directamente el segmento (imprimirá ambas líneas para todos los casos en Tue|Wed|Thu|Fri).

La única opción para mayúsculas y minúsculas es dividirlo con estas dos líneas:

esac
case $now in

Como esto (¡Por favor!, mantenga las variables en MAYÚSCULAS para las variables de entorno):

#!/bin/bash
now=$(date +"%a")
case $now in
    Mon)
        echo "Mon";;
    Tue|Wed|Thu|Fri)
        echo "Tue|Wed|Thu|Fri";;
esac
case $now in
    Fri|Sat|Sun)
        echo "Fri|Sat|Sun";;
    *) ;;
esac

Respuesta3

Otra opción: usar funciones.

$ cat tt
#!/bin/bash

mon()     { echo "  Mon"             ; }
tue_fri() { echo "  Tue|Wed|Thu|Fri" ; }
fri_sun() { echo "  Fri|Sat|Sun"     ; }

now=$(date +"%a")
[[ $1 != "" ]] && now=$1      # use for testing

case $now in
  Mon)         mon              ;;
  Tue|Wed|Thu) tue_fri          ;;
  Fri)         tue_fri; fri_sun ;;
  Sat|Sun)     fri_sun          ;;
  *)           echo "  ERROR"   ;;
esac

y prueba con

$ for f in Mon Tue Wed Thu Fri Sat Sun bla ;do echo "$f"; tt "$f"; done
Mon
  Mon
Tue
  Tue|Wed|Thu|Fri
Wed
  Tue|Wed|Thu|Fri
Thu
  Tue|Wed|Thu|Fri
Fri
  Tue|Wed|Thu|Fri
  Fri|Sat|Sun
Sat
  Fri|Sat|Sun
Sun
  Fri|Sat|Sun
bla
  ERROR

información relacionada