90

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我理解的模式可以在文件名扩展的上下文中正确扩展以匹配这些值,但它不起作用。

4

3 回答 3

180

大括号扩展不起作用,但是*,?[]做。如果您设置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
于 2010-12-29T16:48:48.110 回答
48

我不认为你可以使用大括号。

根据 Bash manual about case in Conditional Constructs

每个模式都经历波浪号扩展、参数扩展、命令替换和算术扩展。

不幸的是,没有关于Brace Expansion的内容。

所以你必须做这样的事情:

case $1 in
    req*)
        ...
        ;;
    met*|meet*)
        ...
        ;;
    *)
        # You should have a default one too.
esac
于 2010-12-29T14:25:55.607 回答
8

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

Bash 默认情况下似乎遵循 POSIX,没有https://stackoverflow.com/a/4555979/895245shopt提到的那样

这是引用: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。模式匹配符号”只提到?,*[].

于 2017-07-01T08:59:56.127 回答