linux shell 参数扩展可高效删除变量前缀或后缀:${var#pattern}删最短前缀,${var##pattern}删最长前缀;${var%pattern}删最短后缀,${var%%pattern}删最长后缀;支持通配符*和?,不支持正则,模式不匹配时保留原值。

在 Linux Shell 中,可以使用参数扩展(Parameter Expansion)快速删除变量值的前缀或后缀,无需调用外部命令如 sed 或 cut,高效且可移植。
删除前缀(从开头匹配并移除最短/最长匹配)
使用 ${var#pattern} 删除最短前缀匹配,${var##pattern} 删除最长前缀匹配。
-
${var#prefix}:去掉开头第一个匹配的prefix(非正则,支持通配符*和?) -
${var##prefix*}:去掉从开头起最长的匹配部分(贪婪匹配)
例如:
var="/home/user/docs/file.txt"echo ${var#/home/} # 输出:user/docs/file.txt
echo ${var##*/} # 输出:file.txt(取最后一级文件名)
删除后缀(从结尾匹配并移除最短/最长匹配)
使用 ${var%pattern} 删除最短后缀匹配,${var%%pattern} 删除最长后缀匹配。
-
${var%suffix}:去掉结尾第一个匹配的suffix -
${var%%.*}:去掉从最后一个点开始的全部内容(取不带扩展名的文件名)
例如:
var="image.jpg.bak"echo ${var%.bak} # 输出:image.jpg
echo ${var%%.*} # 输出:image(删掉最长的 .xxx 后缀)
组合使用前缀与后缀删除(提取中间部分)
可嵌套或分步使用,实现“去头去尾”效果,比如提取路径中纯文件名(不含目录和扩展名):
- 先用
${var##*/}去掉路径前缀 → 得到file.txt - 再用
${result%.*}去掉扩展名 → 得到file
一行写法:
var="/var/log/syslog.20240401.gz"name=${var##*/} # → syslog.20240401.gz
base=${name%.*} # → syslog.20240401
echo ${base%.*} # → syslog
注意点与常见陷阱
这些操作是纯 Shell 内置功能,仅适用于 Bash、Zsh、Dash(部分支持)等兼容 POSIX 的 shell。关键细节:
- 模式中
*表示任意字符(含空),但不递归;?匹配单个字符 - 前缀操作只检查开头,后缀操作只检查结尾;不支持中间删除或正则替换
- 若模式不匹配,变量原值不变(不会报错)
- 要删除固定字符串(含特殊字符如
.、/),直接写即可,无需转义(除非你本意用通配)











