bash脚本if语句中正则匹配失效 任意输入均返回not ok问题
Bash正则名称校验脚本匹配失效问题修复
问题现象
实现名称校验逻辑,规则为仅允许字母、数字、下划线通过,拦截包含特殊符号的输入。但脚本运行时无论输入合法的纯字母/数字内容,还是带特殊符号的非法内容,均输出not ok。
原始问题代码:
#!/bin/bash regex="/^[a-zA-Z0-9_]+$/gm" read -p "Type smth: " text if [[ $text =~ $regex ]] then echo "ok" else echo "not ok" fi
实际运行输出:
user@localhost:~/Documents/scripts$ ./testregex.sh Type smth: hello$#! not ok user@localhost:~/Documents/scripts$ ./testregex.sh Type smth: hello not ok
错误原因
bash中[[ ]]结构的=~正则匹配操作符,和其他编程语言的正则语法有差异,原始代码的正则写法存在两个错误:
- 正则表达式外层不需要使用
/作为分隔符,这是JS、PHP等语言的正则字面量写法,bash会将首尾的/识别为需要匹配的普通字符,导致合法输入无法匹配 - 不需要添加
gm修饰符:bash默认对输入做单行匹配,^和$天然对应输入字符串的首尾位置,全局匹配标识g在单次条件判断中无实际作用,这些修饰符同样会被识别为待匹配的普通字符,直接导致匹配逻辑失效
修复后代码
删除正则中多余的分隔符和修饰符即可:
#!/bin/bash regex="^[a-zA-Z0-9_]+$" read -p "Type smth: " text if [[ $text =~ $regex ]] then echo "ok" else echo "not ok" fi
可选优化
bash内置了兼容不同locale的字符类,[a-zA-Z0-9_]可以替换为[[:alnum:]_],正则可写为^[[:alnum:]_]+$,兼容性更强。
修复后运行逻辑符合预期:输入纯字母、数字、下划线组合时输出ok,输入包含特殊符号的内容时输出not ok。
内容的提问来源于stack exchange,提问作者Taras Paslavskyi
相关产品推荐
相关产品推荐

