如何在案例陈述中使用模式?


78

man页面说case语句使用“文件名扩展模式匹配”。
我通常希望对某些参数使用简称,所以我去了:

case $1 in
    req|reqs|requirements) TASK="Functional Requirements";;
    met|meet|meetings) TASK="Meetings with the client";;
esac

logTimeSpentIn "$TASK"

我尝试了类似的模式,req*或者me{e,}t我知道可以在文件名扩展的上下文中正确扩展以匹配这些值的模式,但是它不起作用。

Answers:


154

括号扩展不起作用,但是*?并且[]可以。如果设置,shopt -s extglob则还可以使用扩展模式匹配

  • ?() -模式零或一
  • *() -模式零次或多次出现
  • +() -一种或多种模式
  • @() -一次出现图案
  • !() -除了图案

这是一个例子:

shopt -s extglob
for arg in apple be cd meet o mississippi
do
    # call functions based on arguments
    case "$arg" in
        a*             ) foo;;    # matches anything starting with "a"
        b?             ) bar;;    # matches any two-character string starting with "b"
        c[de]          ) baz;;    # matches "cd" or "ce"
        me?(e)t        ) qux;;    # matches "met" or "meet"
        @(a|e|i|o|u)   ) fuzz;;   # matches one vowel
        m+(iss)?(ippi) ) fizz;;   # matches "miss" or "mississippi" or others
        *              ) bazinga;; # catchall, matches anything not matched above
    esac
done


@phyatt:谢谢。我在我的答案中添加了链接。
暂停,直到另行通知。

这个答案对我有帮助,因为我已经将模式用双引号(“ a *”)括起来了,而且行不通
wytten

44

我认为您不能使用牙套。

根据Bash手册中关于条件构造的案例。

每个模式都进行代字扩展,参数扩展,命令替换和算术扩展。

不幸的是,关于Brace Expansion的一切。

因此,您必须执行以下操作:

case $1 in
    req*)
        ...
        ;;
    met*|meet*)
        ...
        ;;
    *)
        # You should have a default one too.
esac

6

ifgrep -Eq

arg='abc'
if echo "$arg" | grep -Eq 'a.c|d.*'; then
  echo 'first'
elif echo "$arg" | grep -Eq 'a{2,3}'; then
  echo 'second'
fi

哪里:

  • -q防止grep产生输出,它只是产生退出状态
  • -E 启用扩展的正则表达式

我喜欢这个是因为:

缺点是,这可能比case调用外部grep程序慢,但我倾向于在使用Bash时才考虑性能。

case 是POSIX 7

击出现不遵循POSIX默认shopt通过提到https://stackoverflow.com/a/4555979/895245

这是引用:http : //pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_01部分“情况条件构造”:

有条件的构造情况应执行对应于多个模式中第一个模式的复合列表(请参见模式匹配表示法)。具有相同复合列表的多个模式应以“ |”分隔 符号。[...]

案例构造的格式如下:

case word in
     [(] pattern1 ) compound-list ;;
     [[(] pattern[ | pattern] ... ) compound-list ;;] ...
     [[(] pattern[ | pattern] ... ) compound-list]
  esac

然后http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html#tag_18_13节“2.13模式匹配表示法”只提到?*[]

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.