Bash case $var en plusieurs hits
-
20-12-2019 - |
Question
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
le résultat de ce script est echo DAIRY
Je dois changer le code ci-dessus pour qu'il fasse écho :Glucides du journal
Est-ce possible?
La solution
Utiliser ;;&
au lieu de ;;
si vous voulez ce comportement.
Cela dit, un comportement de chute signifie que vous obtenez HUNGRY
sans condition.Je suggère de définir un indicateur sur les correspondances et de le vérifier avant d'émettre HUNGRY
.
Donc:
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
Cela dit, il serait assez simple de rendre ce code conforme à POSIX sh en le divisant en plusieurs instructions case (et, encore une fois, en n'utilisant pas 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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow