Caso Bash $var en múltiples visitas
-
20-12-2019 - |
Pregunta
shopt -s extglob
CONDITION1="@(*cheese*|*milk*|*cream*)"
CONDITION2="@(*potato*|*rice*|*pasta*)"
myvar1="pasta with cheese"
case ${myvar1} in
${CONDITION1} )
echo DAIRY
;;
${CONDITION2} )
echo CARBS
;;
* )
echo HUNGRY
;;
esac
El resultado de este script es echo DAIRY.
Necesito cambiar el código anterior para que resuene:Carbohidratos de diario
¿Es eso posible?
Solución
Usar ;;&
en lugar de ;;
si quieres este comportamiento.
Dicho esto, el comportamiento fallido significará que obtendrás HUNGRY
incondicionalmente.Sugeriría establecer una bandera en las coincidencias y verificarla antes de emitir HUNGRY
.
Entonces:
myvar1="pasta with cheese"; matched=0
case $myvar1 in
*cheese*|*milk*|*cream*)
echo DAIRY; matched=1 ;;&
*potato*|*rick*|*pasta*)
echo CARBS; matched=1 ;;&
esac
(( matched )) || echo HUNGRY
Dicho esto, sería bastante fácil hacer que este código sea compatible con POSIX sh dividiéndolo en múltiples declaraciones case (y, nuevamente, sin usar extglobs):
myvar1="pasta with cheese"; unset matched
case $myvar1 in *cheese*|*milk*|*cream*) echo DAIRY; matched=1 ;; esac
case $myvar1 in *potato*|*rick*|*pasta*) echo CARBS; matched=1 ;; esac
[ "$matched" ] || echo HUNGRY
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow