質問

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
.

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top