双方括号在Bash中的正则表达式匹配问题

8
考虑下面的代码:

以下是代码:

$ var1=bingo
$ var2=.ingo
$ if [[ "$var1" =~ $var2 ]]; then echo found; fi
found
$ if [[ $var1 =~ "$var2" ]]; then echo found; fi    # line 5
$ if [[ "$var1" =~ "$var2" ]]; then echo found; fi  # line 6
$ if [[ $var1 =~ $var2 ]]; then echo found; fi
found

下面是我在bash shell中完成的工作。
问题是为什么第5行和第6行没有打印出“found”?
我认为我已经知道答案,但我正在寻找一个简单易懂的答案。
总之,当在=〜的右侧使用一个带双引号的变量时,这些双引号只会用于变量扩展。

1
@fedorqui:感谢您的编辑,确实更好的表达方式。 - sjsam
4
=~ 右侧被引用的操作数部分将作为一个字面字符串进行匹配。 - Sean Bright
@SeanBright:实际上,另一个问题与我想问的有点不同。请看问题的最后一部分。 - sjsam
2个回答

10
假设您运行的是 Bash 3.2 或更高版本,则 Bash 手册(向下滚动到描述 [[…]] 的部分)说明:

模式的任何部分都可以加引号,以强制将带引号的部分作为字符串匹配。

并且进一步提到:

如果将模式存储在 shell 变量中,则引用变量扩展会强制整个模式作为字符串进行匹配。

在 Bash 3.2 之前,您提供的示例将按您的预期工作。


实际上,我读了这个,但有点困惑。变量扩展仍然会发生。我是对的吗? - sjsam
1
是的,但是如果写成 bingo != .ingo,那么比较会失败。 - Sean Bright
太棒了,感谢您的编辑。有趣的是,我错过了您在编辑中指出的部分。 - sjsam
可能将这个答案的一部分纳入其中会很有用。关键是这仅适用于Bash 3.2及更高版本。在Bash 3.1中,您尝试的内容将按预期工作。 - Vladislav Martin
1
@VladislavMartin 完成 - Sean Bright

3
当使用双引号时,扩展模式被视为字面量。所以 . 实际上被视为字面量,而不是 Regex 标记,即任何单个字符。 示例:
$ if [[ $var1 =~ "$var2" ]]; then echo found; fi
+ [[ bingo =~ \.ingo ]]

$ if [[ $var1 =~ $var2 ]]; then echo found; fi
+ [[ bingo =~ .ingo ]]
+ echo found
found

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接