0
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

这个脚本的结果是 echo DAIRY

我需要更改上面的代码以使其回显: DIARY CARBS

那可能吗?

4

1 回答 1

2

如果您想要这种行为,请使用;;&而不是。;;

也就是说,失败的行为将意味着你HUNGRY无条件地得到。我建议在匹配项上设置一个标志并在发出之前检查它HUNGRY

所以:

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

也就是说,通过拆分为多个 case 语句(同样,不使用 extglobs)使这段代码符合 POSIX sh 就很容易了:

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
于 2014-04-11T00:13:19.847 回答