linux shell变量替换依赖参数扩展,含四种语法:${var/pattern/replacement}(首匹配)、${var//pattern/replacement}(全局替换)、${var/#prefix/replacement}(前缀替换)、${var/%suffix/replacement}(后缀替换),支持通配符但不支持正则,斜杠需转义或换分隔符。

Linux中Shell变量替换字符串中的特定字符,主要靠参数扩展(Parameter Expansion),无需调用外部命令,速度快、安全、纯内置。关键在于掌握四种基本语法形式,按需选用。
替换第一个匹配项
使用单斜杠:${var/pattern/replacement},只替换从左往右第一个匹配的子串。
- 例如:
str="apple apple banana"; echo ${str/apple/orange}→ 输出orange apple banana - pattern支持通配符(如
*、?),但不支持正则;区分大小写 - 若 pattern 未匹配,原字符串不变
替换所有匹配项
使用双斜杠:${var//pattern/replacement},全局替换所有出现位置。
- 例如:
path="/home/user/docs/user.log"; echo ${path//user/admin}→ 输出/home/admin/docs/admin.log - 注意:斜杠本身需转义,如替换
/要写成${path//\//_}或改用其他分隔符(见下文) - 可嵌套使用,但不推荐过深嵌套,影响可读性
仅替换前缀或后缀
精准定位开头或结尾,避免误改中间内容:
-
${var/#prefix/replacement}:仅当字符串以prefix开头时才替换(#类似正则^)
例:name="v2.1.0"; echo ${name/#v/v3}→v3.1.0;而${name/#x/v3}无变化 -
${var/%suffix/replacement}:仅当字符串以suffix结尾时才替换(%类似正则$)
例:file="report.txt"; echo ${file/%.txt/.log}→report.log
处理特殊字符的小技巧
遇到含斜杠、点号、星号等字符时,注意转义和分隔符选择:
- 变量内替换时,斜杠
/必须写成\/,如${str/\/home\/user/\/opt\/app} - 为避免大量转义,可改用其他分隔符(如
|、#、@),只要前后一致即可:${str//|/→}或${str//#v/#V} - 点号
.在 pattern 中是普通字符,不是通配符;如需匹配任意单字符,用?,如${str/#a?c/XYZ}











