我正在尝试检查给定字符串中是否包含.rel6.
。我对Bash正则表达式行为感到有些困惑。我在这里缺少什么?
os=$(uname -r) # set to string "2.6.32-504.23.4.el6.x86_64"
[[ $os =~ *el6* ]] && echo yes # doesn't match, I understand it is Bash is treating it as a glob expression
[[ $os =~ el6 ]] && echo yes # matches
[[ $os =~ .el6 ]] && echo yes # matches
[[ $os =~ .el6. ]] && echo yes # matches
[[ $os =~ ".el6." ]] && echo yes # matches
[[ $os =~ *".el6." ]] && echo yes # * does not match - why? *
[[ $os =~ ".el6."* ]] && echo yes # matches
re='\.el6\.'
[[ $os =~ $re ]] && echo yes # matches
特别是这一个:
[[ $os =~ *".el6." ]] && echo yes
答案 0 :(得分:3)
=~
运算符对其左侧的字符串执行正则表达式匹配操作,右侧有表达式模式。因此,所有RHS都是正则表达式模式。
[[ $os =~ *el6* ]] && echo yes
不匹配,因为正则表达式为*el6*
,而*
是量词,但您无法量化正则表达式的开头,因此它是无效的正则表达式。请注意,[[ $os =~ el6* ]] && echo yes
将打印yes
,因为el6*
匹配el
和0 + 6
s。
与[[ $os =~ *".el6." ]] && echo yes
类似的问题是:正则表达式为*.el6.
,且无效。
如果您想检查字符串中是否有.el6.
,请使用[[ $os = *".el6."* ]] && echo yes
。在这里,glob模式将为*.el6.*
,您需要=
运算符。