【问题标题】:Is it possible to use curly braces in case selector in bash?是否可以在 bash 中的 case 选择器中使用花括号?
【发布时间】:2019-06-16 08:55:04
【问题描述】:

我想在大小写切换中对匹配的行执行一些操作。而且因为字符串很长,我想使用 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 基于通配符(或“glob”)模式匹配;大括号扩展是另一回事。您最好的选择可能是启用 extglob,并使用扩展的 glob 语法。
  • 替代方案:两个嵌套的case 语句,longstr_*),然后是*one|*five)

标签: bash case glob curly-braces brace-expansion


【解决方案1】:

由于case 模式中没有进行大括号扩展,因此您可以改用 bash 的扩展 glob 语法:

shopt -s extglob

for i in longstr_one longstr_two; do
    case $i in
    longstr_@(one|five) )
        echo "matched $i"
        ;;
        *)
        echo "no matches of $i"
        ;;
    esac
done

语法@(this|that|theother|...) 匹配任一子模式。

【讨论】:

    【解决方案2】:

    来自bash manual

    案例
    case命令的语法是:

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

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

    也就是说brace expansion没有在casepattern上执行,所以这里不能使用。

    【讨论】:

      【解决方案3】:

      不是匹配i 的整个值,而是匹配删除公共前缀后剩余的部分。

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

      这种方法不依赖于任何非标准扩展,例如extglob

      【讨论】:

      • 感谢您的建议。它可能对某人有用。但在我的情况下它不适用,因为实际上那些 longstr 前缀都是不同的。
      • 那你为什么一开始就认为大括号扩展会有用呢?
      • 因为还有很多重复。我使用了 Gordon Davisson 的解决方案,您可以在这里查看我的真实用例:github.com/Ashark/archlinux-amdgpu/blob/19.20-test/…
      猜你喜欢
      • 2021-12-16
      • 1970-01-01
      • 2011-07-25
      • 2021-10-31
      • 2023-03-17
      • 1970-01-01
      • 2011-11-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多