Bash脚本if条件用正则匹配含两位数字的变量失败如何解决
Bash 正则匹配含两位数字的php配置路径正确实现
问题原因
你写的判断逻辑不生效,是踩了Bash正则匹配的几个常见语法坑:
- 变量赋值写法错误:Bash中变量赋值
=两侧绝对不能加空格,你写的DPHPV = /usr/local/nginx/conf/php81-remi.conf;会被解析成执行DPHPV命令,参数是=和后面的路径,根本不会完成变量赋值。 - 正则语法错误:
=~操作符是正则子串匹配,不需要像glob通配符那样前后加*,加了反而会被识别成正则量词报错- POSIX数字字符类的正确写法是
[[:digit:]],必须嵌套一层方括号,单独写[:digit:]只会匹配冒号、d/i/g/t这几个普通字符 - 给正则部分加双引号会把所有特殊字符转义成普通文本,完全失去正则匹配能力
- 正则里
.是匹配任意单字符的特殊符号,如果要匹配文件名里的真实点号,需要转义为\.
正确实现代码
# 首先修正变量赋值,等号两侧无空格 DPHPV=/usr/local/nginx/conf/php81-remi.conf # 正则匹配判断 if [[ "$DPHPV" =~ php[[:digit:]][[:digit:]]-remi\.conf ]] then echo "匹配成功,目标为两位数字版本的php配置文件" fi
可选优化
如果要避免匹配到php81-remi.conf.bak这类带后缀的非目标文件,可以在正则末尾加$表示匹配字符串结尾:if [[ "$DPHPV" =~ php[[:digit:]][[:digit:]]-remi\.conf$ ]]
如果需要同时兼容1位、2位数字的版本号(比如php7-remi.conf、php81-remi.conf都命中),可以把数字部分改写为[[:digit:]]{1,2}。
内容的提问来源于stack exchange,提问作者JCats
相关产品推荐
相关产品推荐

