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

时间:2016-06-14 14:47:04

标签: bash

请考虑以下代码:

PreferenceManager.getDefaultSharedPreferences(getActivity());

以上是我在bash shell中所做的。

问题是为什么行$ 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 5不打印6

我想我已经知道了答案,但我正在寻找一个简单易懂的答案。

总而言之,当在found的右侧使用变量(双引号内)时,双引号是否只用于变量扩展?

2 个答案:

答案 0 :(得分:8)

假设您正在运行Bash 3.2或更新版本,bash manual(向下滚动到[[…]]的说明)指出:

  

可以引用模式的任何部分以强制引用的部分匹配为字符串。

进一步说:

  

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

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

答案 1 :(得分:2)

使用双引号时,将按字面处理扩展模式。所以.实际上是按字面意思对待的,而不是正则表达式令牌,即任何单个字符。

示例:

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

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