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?

Était-ce utile?

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
scroll top