文章目录

Shell 脚本正则表达式:=~ 运算符

发布于 2026-04-12 00:18:43 · 浏览 8 次 · 评论 0 条

Shell 脚本正则表达式:=~ 运算符

Bash 脚本处理字符串时,=~ 运算符是进行正则表达式匹配的核心工具。它允许你直接在 if 语句中判断字符串是否符合特定模式,甚至提取关键片段。

使用 [[ ... ]] 结构包裹判断条件。这是支持 =~ 运算符的前提,不要使用 [ ... ]test 命令。


1. 基础语法与匹配

左侧放置待检测的字符串,右侧放置正则表达式。

创建 一个名为 check.sh 的脚本文件。

输入 以下代码来检测字符串中是否包含连续的数字:

#!/bin/bash

str="Server 01 is running"

# 检查字符串中是否包含数字
if [[ "$str" =~ [0-9]+ ]]; then
    echo "发现数字"
else
    echo "未发现数字"
fi
```

**赋予** 执行权限并 **运行** 脚本:

```bash
chmod +x check.sh
./check.sh
```

输出结果为“发现数字”。

---

### 2. 提取匹配内容

`=~` 运算符不仅能判断真假,还能将匹配到的具体内容存入 `BASH_REMATCH` 数组中。索引 `0` 是整个匹配结果,索引 `1` 是第一个括号内的子组,以此类推。

**修改** `check.sh` 内容,尝试从 "Server 01" 中提取 "01":

```bash
#!/bin/bash

str="Server 01 is running"

# 使用括号 () 创建捕获组
if [[ "$str" =~ ([0-9]+) ]]; then
    echo "完整匹配: ${BASH_REMATCH[0]}"
    echo "捕获组1: ${BASH_REMATCH[1]}"
fi

再次运行 脚本,终端将显示 "01"。


3. 处理复杂模式与引号陷阱

在使用 =~ 时,右侧的正则表达式建议不要加引号。如果加了引号,Bash 可能会将其视为普通字符串而非正则表达式,导致元字符失效。

输入 以下代码验证邮箱格式(注意右侧变量 pattern 未加引号):

#!/bin/bash

email="user@example.com"

# 定义正则模式(赋值时可以使用引号)
pattern="^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}$"

# 在 [[ ]] 中使用 $pattern 时,不要加引号
if [[ "$email" =~ $pattern ]]; then
    echo "邮箱格式有效"
else
    echo "邮箱格式无效"
fi

执行 脚本确认结果。


4. 常用运算符对比

了解 =~ 与其他字符串处理方式的区别,能帮你选择最合适的工具。

运算符/命令 适用场景 支持正则 典型用法示例
=~ 条件判断与提取 是 (扩展正则) [[ "$s" =~ ^[0-9]+$ ]]
== Glob 通配符匹配 [[ "$s" == *.txt ]]` | | `grep` | 文件或流内容搜索 | 是 | `echo "$s" \| grep -E "^[0-9]+"

5. 匹配 IP 地址实战

综合运用上述知识,编写一个脚本来验证 IPv4 地址格式。

创建 文件 check_ip.sh

输入 以下逻辑:

#!/bin/bash

ip="192.168.1.1"

# 正则解释:
# ^$ 首尾定位
# ([0-9]{1,3}\.){3} 三组 "数字加点的组合"
# [0-9]{1,3} 最后一组数字
if [[ "$ip" =~ ^([0-9]{1,3}\.){3}[0-9]{1,3}$ ]]; then
    echo "$ip 格式看起来像 IPv4"
    # 进一步提取每一段
    IFS='.' read -r i1 i2 i3 i4 <<< "$ip"
    echo "第一段是: $i1"
else
    echo "格式错误"
fi

运行 脚本查看解析效果。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文