请考虑以下代码:
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
的右侧使用变量(双引号内)时,双引号是否只用于变量扩展?
答案 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