2016-11-22 22 views
0

好奇,想知道为什么下面不工作的性质:+BASH =〜包含子: “+” 或正则表达式字符行为

人物“\”“(”“*”有道理即*将扩大到文件夹/文件在当前目录(命令行shell扩展时),同样\将希望关闭性格的工作,但我的理解是“+”应该像“ - ”一样工作。

PS:我知道在IF语句中放置双引号,即“$ {o}”,将适用于下面我测试用例中的所有字符。在带有或不带双引号的IF语句中使用\ $ {o}将会失败所有检查。

$ for o in - + \` ~ \~ , _ =/\\ ! @ \# $ \$ %^\& \* \(\); do a="a${o}b${o}c";if [[ $a =~ ${o} ]]; then echo "${o} exists in $a and =~ works"; else echo -e "\ncharacter ${o} doesn't work with =~\n"; fi; done 
- exists in a-b-c and =~ works 

character + doesn't work with =~ 

` exists in a`b`c and =~ works 
/home/ubuntu exists in a/home/ubuntub/home/ubuntuc and =~ works 
~ exists in a~b~c and =~ works 
, exists in a,b,c and =~ works 
_ exists in a_b_c and =~ works 
= exists in a=b=c and =~ works 
/exists in a/b/c and =~ works 

character \ doesn't work with =~ 

! exists in a!b!c and =~ works 
@ exists in [email protected]@c and =~ works 
# exists in a#b#c and =~ works 
$ exists in a$b$c and =~ works 
$ exists in a$b$c and =~ works 
% exists in a%b%c and =~ works 
^ exists in a^b^c and =~ works 
& exists in a&b&c and =~ works 

character * doesn't work with =~ 


character (doesn't work with =~ 

) exists in a)b)c and =~ works 
+1

没有'*'不扩展到文件列表 - 在正则表达式中,它意味着“零或多个前面的标记”。 –

+0

@CharlesDuffy正确,我的意思是“for”声明。 –

+0

......但是你为'for'语句转义为'\ *',所以它没有在那里做任何这样的替换。 –

回答

3

这个问题背后的根本误解是=~是一个子串搜索运算符。 这不是

=~的右侧被评估为POSIX ERE表达式。因此,=~是一个正则表达式匹配运算符,当引用右侧引用其内容时(或者在解释为ERE时知道该字符串本身仅匹配自身)时,经常用于搜索。


+,在正则表达式,是指“1或更多的前述令牌的” - 正如*表示“0或更多的前述令牌”。

因此,无论是[[ $foo =~ + ]][[ $foo =~ * ]]是没有意义的,因为这些检查零或更多的的一个在先令牌并不以所有存在。

同样,()在ERE中作为匹配组的开始和结束有意义,所以当它们被裸露(未转义/未被引用)时,它们会导致无效的正则表达式。

如果引用扩展,相比之下,包含的所有字符将被视为文字,而不是被视为正则表达式元字符,从而导致可能的预期行为。


如果你想检查文字字符是否包含在一个字符串,要么报价吧 - [[ $foo =~ "$o" ]] - 或使用通配符式样的模式:[[ $foo = *"$o"* ]]

相关问题