首页 > 解决方案 > 是否可以在 bash 中的 case 选择器中使用花括号?

问题描述

我想在 case switch 中对匹配的行进行一些操作。而且因为字符串很长,我想使用 bash 花括号。但它不起作用。

这段没有花括号的代码按预期工作:

for i in longstr_one longstr_two; do
    case $i in
    longstr_one| longstr_five)
        echo matched $i
        ;;
        *)
        echo no matches of $i
        ;;
    esac
done

我得到了预期的结果:

matched longstr_one
no matches of longstr_two

但是以下带有花括号的代码没有:

for i in longstr_one longstr_two; do
    case $i in
    longstr_{one|,five})
        echo matched $i
        ;;
        *)
        echo no matches of $i
        ;;
    esac
done   

我得到了不正确的结果:

no matches of longstr_one
no matches of longstr_two

为什么它不工作?是否可以在 bash 中的 case 选择器中使用花括号?

标签: bashcaseglobcurly-bracesbrace-expansion

解决方案


来自bash 手册

case
case 命令的语法是:

case word in
      [ [(] pattern [| pattern]…) command-list ;;]…
esac

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

这意味着没有对's pattern执行大括号扩展,因此无法在此处使用它。case


推荐阅读