複数のヒットのBASHケース$ VAR
-
20-12-2019 - |
質問
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
.
このスクリプトの結果はエコー乳製品
です。コードを変更する必要があるため、エコー: 日記 炭水化物
は可能な限り?
解決
この動作が必要な場合は、;;&
の代わりに;;
を使用します。
述べたように、フォールスルー動作はあなたが無条件にHUNGRY
を取得することを意味します。HUNGRY
を発行する前に、一致し、それを確認する前にフラグを設定することをお勧めします。
SO:
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
.
言ったように、このコードを複数のケースステートメントに分割してPOSIX SHに準拠させるのに十分な容易であろう(そして繰り返しの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
. 所属していません StackOverflow