Bash Case $var in mehreren Treffern
-
20-12-2019 - |
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?
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