【发布时间】:2014-05-23 02:52:02
【问题描述】:
在查看一些 shell 脚本时,我遇到了几个 if 语句实例,将一些普通变量与另一个包含在 @( ) 括号中的变量进行比较。
@(....) 有什么特殊含义还是我在这里遗漏了一些明显的东西? if 测试示例:
if [[ ${VAR} != @(${VAR2}) ]]
谢谢
【问题讨论】:
在查看一些 shell 脚本时,我遇到了几个 if 语句实例,将一些普通变量与另一个包含在 @( ) 括号中的变量进行比较。
@(....) 有什么特殊含义还是我在这里遗漏了一些明显的东西? if 测试示例:
if [[ ${VAR} != @(${VAR2}) ]]
谢谢
【问题讨论】:
这是一个扩展模式,借用自 ksh。最初您需要使用shopt -s extglob 启用对它的支持,但它在bash 4.1 中成为[[ ... ]] 内部的默认行为。 @(...) 匹配包含的模式之一。 @(pattern) 和 pattern 本身是等价的,所以我假设 $VAR2 的内容至少包含一个管道,因此扩展类似于 @(foo|bar)。在这种情况下,如果$VAR1 不 匹配foo 或bar,则测试将成功。
【讨论】:
perl!
!(...) 需要设置 extglob,但这在 4.2 中再次得到修复。
来自bash 手册页:
@(pattern-list) Matches one of the given patterns
所以${VAR2} 应该是由| 分隔的模式列表,您的代码会测试${VAR} 是否与其中任何一个匹配。
【讨论】: