You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 14:06:27