linux中[[ string =~ regex ]]用于字符串正则匹配,右侧regex不加引号,左侧string建议加双引号;支持^、$、+、|等元字符,但不支持\d等perl简写,区别于通配符==匹配。

Linux中用双方括号 [[ ]] 处理正则匹配,核心是使用 =~ 操作符。它让字符串比较支持 shell 风格的正则表达式(不是完整 POSIX ERE,但足够日常使用),比单 [ ] 更安全、更灵活。
[[ $var =~ pattern ]] 是标准写法
注意:pattern 不能加引号(否则会被当作字面量,不触发正则),且必须写在右侧;左侧变量建议加双引号防止空值或含空格出错,但 =~ 本身不要求左边引号([[ "$var" =~ pattern ]] 更稳妥)。
正则匹配常用写法与要点
-
[[ "abc123" =~ [0-9]+ ]]→ 匹配成功(含数字) -
[[ "file.txt" =~ \.txt$ ]]→ 匹配以.txt结尾($表示行尾) -
[[ "ERROR: timeout" =~ ^[A-Z]{2,}: ]]→ 匹配大写字母开头+冒号(如ERROR:、WARN:) -
[[ "$input" =~ ^(start|stop|restart)$ ]]→ 精确匹配三个关键词之一
⚠️ 注意事项:
-
^和$是锚点,需显式写出才能控制起止位置 -
.、*、+、?、[]、()、|等都按正则语义解析(不是通配符) - 不支持
\d或\s这类 Perl 风格简写,用[0-9]、[[:space:]]替代 - 字符类推荐用
[:class:]形式,比如[[ "test" =~ [[:lower:]]+ ]]
实用示例:校验用户输入格式
read -p "Enter IP address: " ip
if [[ "$ip" =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then
# 粗略检查四段数字,每段最多三位(未验证 0–255 范围)
echo "Looks like an IPv4 format"
else
echo "Invalid format"
fi
更严谨的 IP 校验可拆成四次 [[ $seg =~ ^[0-9]+$ ]] && (( seg >= 0 && seg ,但正则只负责结构初筛。
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
和通配符模式的区别(别混用)
-
[[ $str == *.log ]]→ 用==是通配符匹配(*?[a-z]),不是正则 -
[[ $str =~ \.log$ ]]→ 用=~才是正则匹配,支持^$+|等
两者语法、引擎、能力完全不同。需要模糊文本特征判断(如“含邮箱”“是 URL”“有时间戳”),优先选 =~。
错误写法避坑
- ❌
[[ $var =~ "^[a-z]+$" ]]—— 右侧加引号会禁用正则,变成字面匹配 - ❌
[[ $var =~ ^[a-z]+ ]]—— 若$var为空或含空格且没引号,可能报错或行为异常 - ❌
[ $var =~ ^[a-z]+$ ]—— 单[ ]不支持=~,直接语法错误 - ❌
[[ $var =~ [a-z]+ ]]—— 没^$容易误匹配(如"XabcY"也会通过)
用 [[ ]] + =~ 是 Shell 原生最轻量、最可靠的正则入口,无需调用 grep 或 awk。










