【问题标题】:What is @(...|...|...) syntax in bash?bash 中的 @(...|...|...) 语法是什么?
【发布时间】:2016-06-19 03:31:42
【问题描述】:

专注于 @() 语法在此 question 中提到:

[[ $OSTYPE == *@(darwin|freebsd|solaris|cygwin|openbsd)* ]]

这个语法从何而来?为什么在这种情况下使用它?和有什么区别:

[[ $OSTYPE =~ (darwin|freebsd|solaris|cygwin|openbsd) ]]

[[ $OSTYPE == *(darwin|freebsd|solaris|cygwin|openbsd) ]]

这一切似乎都是等价的。

是否使用此语法代替 =~ 运算符以获得更好的正则表达式可移植性?

感谢您的澄清

【问题讨论】:

  • @Cyrus 我的问题更多的是“为什么使用这种语法”而不是“如何获得结果”。
  • 谢谢@choroba。所以与COMP_TYPE 无关,也与列表完成无关...上面的示例是从 bash 完成代码中提取的,这让我感到困惑。
  • @glenn jackman 当我阅读最初的问题时,在我看来,关于全局语法、流控制和行的返回值以及后续代码的内容更为笼统。我的意图是专注于 @() 语法、兴趣和效率,以对抗其他解决方案。当我写这个问题时,我在最初的问题中错过了关于extglob 模式的评论和关于@() 的详细信息。我应该删除这个问题吗?如果是这样,对不起失去的时间。

标签: regex bash shell scripting


【解决方案1】:

这使用man bash模式匹配部分中解释的规则:

[[ $OSTYPE == *@(darwin|freebsd|solaris|cygwin|openbsd)* ]]

这使用正则表达式来执行匹配:

[[ $OSTYPE =~ (darwin|freebsd|solaris|cygwin|openbsd) ]]

这些是非常不同的机制,具有不同的性能影响。 darwinfreebsd、...的值中没有模式,这些是简单的文字字符串。 @(...) 语法非常适合这种更简单的匹配逻辑,因此使用正则表达式似乎有点过头了。

在这个例子中,两种书写风格给出了相同的行为,只是它们通过不同的机制执行匹配。如果不是像darwinfreebsd、...这样的文字字符串列表,您有更复杂的正则表达式模式,那么第一种书写风格将不是一个选项,您需要使用带有完整正则表达式的第二个版本力量。

是否使用此语法代替 =~ 运算符以获得更好的正则表达式可移植性?

使用它是因为它足以达到目的,不需要正则表达式。

【讨论】:

  • 后面几行也可以与正则表达式一起使用local mansect="@([0-9lnp]|[0-9][px]|3?(gl|pm))".
  • 这不是正则表达式。将 shell 通配符模式与正则表达式混淆是一个常见的错误,因为它们看起来很相似。当解析为 shell 通配符和正则表达式时,您给出的这个示例将被不同地解释。
  • 你是对的。两个错误+一个重复。这不是我的日子(-;
【解决方案2】:

man bash 中搜索extglob 选项:

如果使用shopt 内置函数启用了extglob shell 选项,则可以识别多个扩展模式匹配运算符。在 在下面的描述中,模式列表是一个或多个模式的列表,由| 分隔。可以形成复合图案 使用以下一种或多种子模式:

?(pattern-list)
    Matches zero or one occurrence of the given patterns
*(pattern-list)
    Matches zero or more occurrences of the given patterns
+(pattern-list)
    Matches one or more occurrences of the given patterns
@(pattern-list)
    Matches one of the given patterns
!(pattern-list)
    Matches anything except one of the given patterns

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-09-09
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    • 1970-01-01
    • 2021-12-21
    • 1970-01-01
    • 2013-05-17
    相关资源
    最近更新 更多