Bash中${var#pattern}前缀模式匹配未生效原因解答
现象原因
Bash 中 ${var#pattern} 属于前缀删除操作,匹配规则强制从变量值的最起始位置开始校验模式,不会在字符串中间检索匹配项,这是两次执行都返回完整字符串的核心原因。
示例中变量值为 this is a test,字符串起始位置的字符序列是 this,既不匹配模式t?st,也不匹配模式test;模式匹配失败时Bash会直接返回原始变量值,不做任何删除处理。
各类字符串删除操作符的匹配规则
#/##:仅从字符串开头锚定匹配,分别删除最短、最长的匹配前缀%/%%:仅从字符串末尾锚定匹配,分别删除最短、最长的匹配后缀
如果需要删除字符串任意位置的匹配片段,前缀/后缀删除操作符无法实现,需要使用字符串替换语法。
对应场景的正确写法示例
- 前缀删除的正常效果:
var="this is a test"; echo ${var#this} # 输出: is a test
模式从字符串开头刚好匹配到this,匹配部分被删除,返回剩余内容。
- 实现预期效果(删除末尾的
test,得到this is a),需要使用后缀删除操作符:
var="this is a test"; echo ${var% test} # 输出:this is a
- 删除字符串任意位置的匹配片段,使用替换语法将匹配内容替换为空即可:
var="this is a test"; echo ${var/test/} # 输出:this is a
内容的提问来源于stack exchange,提问作者jisu choi
相关产品推荐
相关产品推荐

