在查看一些shell脚本时,我遇到了几个if语句实例,它们将一些正常变量与另一个包含在@()括号中的变量进行比较。
@(....)是否有某些特殊含义,或者我错过了一些明显的东西?如果测试的例子:
if [[ ${VAR} != @(${VAR2}) ]]
由于
答案 0 :(得分:9)
这是一种扩展模式,借鉴ksh
。最初您需要使用shopt -s extglob
启用对它的支持,但它成为[[ ... ]]
4.1中bash
内的默认行为。 @(...)
匹配其中一个封闭的模式。 @(pattern)
和pattern
本身是等价的,因此我假设$VAR2
的内容至少包含一个管道,因此扩展类似于@(foo|bar)
。在这种情况下,如果$VAR1
不匹配foo
或bar
,则测试会成功。
答案 1 :(得分:2)
来自bash
手册页:
@(pattern-list) Matches one of the given patterns
因此,${VAR2}
应该是由|
分隔的模式列表,并且您的代码会测试${VAR}
是否与其中任何一个匹配。