Linux Shell中用${var%pattern}删除最短右后缀、${var%%pattern}删除最长右后缀,pattern为shell通配符非正则表达式,如${file%.txt}得report_v2、${path%%.*}得/home/user/docs/readme。

在 Linux Shell 中,删除字符串右侧匹配的后缀,主要用 参数扩展(Parameter Expansion) 的 ${var%pattern} 和 ${var%%pattern} 语法。
使用 ${var%pattern} 删除最短匹配的后缀
该语法从字符串末尾开始,尝试匹配 pattern,只删除**最右边、最短**的一次匹配。
-
%表示“从右向左,最小匹配” -
pattern支持通配符(如*、?、[...]),但不是正则表达式 - 原变量值不变,仅返回处理后的新字符串
示例:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
echo ${file%.txt} # 输出:report_v2
echo ${file%_v*} # 输出:report
使用 ${var%%pattern} 删除最长匹配的后缀
该语法同样从右向左,但会删除**尽可能长**的匹配部分(贪婪匹配)。
-
%%表示“从右向左,最大匹配” - 适合处理嵌套或含多个分隔符的后缀
示例:
path="/home/user/docs/readme.md.bak"echo ${path%.bak} # 输出:/home/user/docs/readme.md
echo ${path%%.*} # 输出:/home/user/docs/readme
注意 pattern 的书写规则
pattern 是 shell 通配模式,不是正则表达式,需特别注意:
-
*匹配任意长度字符(包括空) -
?匹配单个任意字符 -
[a-z]匹配指定范围内的一个字符 - 若后缀含特殊字符(如
.、*),需转义或用方括号包裹,例如:\.或[.]
错误写法:${file%.txt.}(末尾点未转义,在某些情况下可能意外匹配)
推荐写法:${file%.txt} 或 ${file%[.]txt}
实际应用小技巧
- 提取文件名不含扩展名:
${filename%.*} - 去掉版本号后缀:
${name%_v[0-9]*} - 配合变量赋值使用:
base=${full_path##*/}; ext=${base##*.}(先取 basename,再取扩展名) - 安全起见,建议先测试 pattern 是否匹配成功,可结合
[[ $var == *pattern ]]判断

















