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

为何Bash的=~操作符会忽略正则模式的最后部分?

问题原因解析

1. Bash与csh匹配规则的核心差异

csh中的=~使用文件名通配符(Globbing)匹配,其中*代表任意长度的任意字符;而Bash的[[ string =~ pattern ]]语法是正则表达式匹配,*作为正则量词,仅修饰前一个字符,表示「该字符出现0次或多次」。

2. 你的脚本中模式的实际含义

你写的匹配模式"John"*,在Bash中会被解析为正则表达式John*——这里的*只作用于最后一个字符n,意思是:匹配Joh后面跟0个或多个n。

  • 当name="John":字符串是Joh+1个n,符合正则规则,匹配成功。
  • 当name="Joh":字符串是Joh+0个n,符合正则规则,匹配成功。
  • 当name="Jo":字符串没有h,不符合Joh的前缀要求,匹配失败。

3. 复刻csh匹配效果的两种方式

如果你想实现csh中「匹配以John开头的任意字符串」的逻辑,可选择以下两种写法:

  • 用Bash的Globbing匹配(和csh行为完全一致),将=~替换为==:
    if [[ "${name}" == John* ]]; then
        echo "found"
    else
        echo "not found"
    fi
    
  • 用正则表达式匹配,明确指定开头和任意后续字符:
    if [[ "${name}" =~ ^John.* ]]; then
        echo "found"
    else
        echo "not found"
    fi
    
    其中^表示字符串开头,.*表示任意长度的任意字符,和csh的*功能等价。

内容的提问来源于stack exchange,提问作者Tyler

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 18:40:33