为什么这个shell常规不能匹配

时间:2019-01-20 09:33:34

标签: shell

我不知道为什么这个shell常规(第2行)无法匹配,谁可以提供官方链接来说明这一点?

$ str="origin/HEAD -> origin/master"
$ if [[ $str =~ '*origin\/HEAD*' ]] ; then echo OK ; fi # why can't work ???
$ if [[ $str =~ .*origin\/HEAD.* ]] ; then echo OK ; fi
OK
$ reg='.*origin\/HEAD.*'
$ if [[ $str =~ $reg ]] ; then echo OK ; fi # what's different of Line 2 ???
OK

1 个答案:

答案 0 :(得分:0)

set -x添加到代码中后,您会获得更多信息:

+ [[ origin/HEAD -> origin/master =~ \*origin\\/HEAD\* ]]
+ [[ origin/HEAD -> origin/master =~ .*origin/HEAD.* ]]
+ echo OK
OK
+ reg='.*origin\/HEAD.*'
+ [[ origin/HEAD -> origin/master =~ .*origin\/HEAD.* ]]

作业中的特殊字符用作单引号内的普通字符。您会在第一行看到其他反斜杠,从而避免了shell扩展。
您的reg=也使用单引号。当您使用$reg时,通配符将再次展开。 也许再看一个例子:

reg='ls *'
echo "reg (unquoted)="${reg}
echo "reg (quoted)  =${reg}"