bash字符串替换中&符号为何会替换为原匹配内容?(bash 5.2+)
Bash字符串替换中&的特殊行为解释
在bash的参数扩展字符串替换语法(${parameter/pattern/string})中,替换字符串里的&是特殊字符——它会被匹配到的原内容替换。这个特性并非bash 5.2新增,是该语法的固有行为,只是你之前可能没遇到过。
结合你的测试代码分析:
test="test string MARKER end"; echo "${test/MARKER/new value '&' why & in new value was replaced}"
替换字符串里有两个&:
- 被单引号包裹的
'&':单引号在bash中属于强引用,内部字符不会被解析,所以这个&会原样输出。 - 未被引用的
&:bash会自动将其替换为原匹配的MARKER,这就是输出里出现MARKER的原因。
如果要在替换字符串中输出字面量的&,有两种方式:
- 用反斜杠转义:
\& - 将
&放在单引号内包裹
比如修改后的代码:
test="test string MARKER end"; echo "${test/MARKER/new value '&' why \& in new value was replaced}"
执行后会得到符合预期的输出:
test string new value & why & in new value was replaced end
内容的提问来源于stack exchange,提问作者dobordx
相关产品推荐
相关产品推荐

