什么是bash中的@(... | ... | ...)语法?

问题描述 投票:5回答:2

重点关注这个qazxsw poi中提到的qazxsw poi语法:

@()

这种语法来自哪里?为什么在这种情况下使用它?和有什么区别:

question

要么

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

这似乎都是等价的。

是否使用此语法代替[[ $OSTYPE =~ (darwin|freebsd|solaris|cygwin|openbsd) ]]运算符以便使用正则表达式实现更好的可移植性?

谢谢你的澄清

regex bash shell scripting
2个回答
2
投票

这使用了[[ $OSTYPE == *(darwin|freebsd|solaris|cygwin|openbsd) ]]的Pattern Matching部分中解释的规则:

=~

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

man bash

这些是非常不同的机制,具有不同的性能影响。值[[ $OSTYPE == *@(darwin|freebsd|solaris|cygwin|openbsd)* ]][[ $OSTYPE =~ (darwin|freebsd|solaris|cygwin|openbsd) ]],......中没有模式,这些是简单的文字字符串。 darwin语法非常适合这种更简单的匹配逻辑,因此使用正则表达式似乎有点过分。

在这个例子中,两种写作风格都给出了相同的行为,只是它们通过不同的机制执行匹配。如果不是像freebsd@(...)这样的文字字符串列表......你有更复杂的正则表达式模式,那么第一种写作风格就不是一种选择,你需要使用具有完全正则表达能力的第二种版本。

是否使用此语法代替darwin运算符以便使用正则表达式实现更好的可移植性?

使用它是因为它足够好用于此目的,不需要正则表达式。


5
投票

freebsd中搜索=~选项:

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

shopt
© www.soinside.com 2019 - 2024. All rights reserved.