Frage

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

Das Ergebnis dieses Skripts ist echo DAIRY

Ich muss den obigen Code ändern, damit er Folgendes widerspiegelt:Tagebuch Kohlenhydrate

Ist das möglich?

War es hilfreich?

Lösung

Verwenden ;;& anstatt ;; wenn Sie dieses Verhalten wünschen.

Das heißt, Fall-Through-Verhalten bedeutet, dass Sie bekommen HUNGRY bedingungslos.Ich würde vorschlagen, ein Flag für Übereinstimmungen zu setzen und vor dem Senden darauf zu prüfen HUNGRY.

Also:

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

Allerdings wäre es einfach genug, diesen Code mit POSIX sh kompatibel zu machen, indem man ihn in mehrere Case-Anweisungen aufteilt (und wiederum keine Extglobs verwendet):

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top