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