bash测试条件中的正则表达式必须不带引号

环境

1
2
ipv4_pattern="((1[0-9][0-9]\.)|(2[0-4][0-9]\.)|(25[0-5]\.)|([1-9][0-9]\.)|([0-9]\.)){3}((1[0-9][0-9])|(2[0-4][0-9])|(25[0-5])|([1-9][0-9])|([0-9]))"
[[ "192.168.2.1" =~ "${ipv4_pattern}" ]] && echo "yes"

复现

结果没有输出yes,正则表达式无法匹配192.168.2.1

解决

bash测试条件中的正则表达式不能使用引号包围起来,不管是字面量字符串还是变量都不允许带引号。

在测试条件中=~的右侧必须处于没有引号的状态,正则表达式才会起效果,否则会将正则表达式当成普通字符串去与左侧字符串相比较。

1
2
3
4
ipv4_pattern="192.168.2.1"
[[ "192.168.2.1" =~ "${ipv4_pattern}" ]] && echo "yes"

# yes