linux shell中删除字符串左侧前缀首选参数扩展:${var#pattern}删最短匹配前缀,${var##pattern}删最长匹配前缀,二者均从开头匹配通配符模式,不支持正则,且无子进程开销。

在 Linux Shell 中,删除字符串左侧匹配的前缀,主要使用参数扩展(Parameter Expansion)语法 ${var#pattern} 或 ${var##pattern}。
用 # 删除最短左侧匹配前缀
${var#pattern} 从变量 var 开头开始,尝试匹配 pattern,只删除**第一个(最短)匹配到的前缀**。
- pattern 支持通配符:*、?、[...],但不是正则表达式
- 如果 pattern 未匹配成功,原字符串不变
- 示例:
filename="backup_log_20240501.txt"
echo ${filename#backup_} → 输出 log_20240501.txt
用 ## 删除最长左侧匹配前缀
${var##pattern} 同样从左侧匹配,但会删除**最长的匹配前缀**,常用于“取文件名”或“去掉路径”等场景。
- 适合处理嵌套结构,比如多级路径或重复前缀
- 示例:
path="/home/user/docs/report.pdf"
echo ${path##*/} → 输出 report.pdf(删掉最长的 / 开头路径前缀)
str="abcabcabc123"
echo ${str##abc*} → 输出 123(匹配并删掉最长的 abc*,即 abcabcabc)
注意点和常见误区
- # 和 ## 只作用于字符串**开头**,不支持中间或右侧匹配
- pattern 是 shell 通配模式,不是正则;如需正则匹配,得用 sed、awk 或 Bash 4.2+ 的 [[ $str =~ regex ]]
- 变量未定义或为空时,结果为空字符串,不会报错
- 想安全使用,可先判断变量是否存在:[ -n "$var" ] && echo ${var#prefix}
对比其他方法(非推荐但可了解)
- sed 's/^prefix//' :功能强但启动开销大,适合复杂替换或管道处理
- cut -d'X' -f2- :仅适用于固定分隔符,灵活性差
- 纯 Bash 参数扩展(# / ##)是轻量、内置、无子进程的首选











