为什么与号 (&) 在不转义的情况下不能用于字符串替换?

为什么与号 (&) 在不转义的情况下不能用于字符串替换?

下面的脚本非常简单,替换&&

string="Foo & Bar"
echo "${string//&/&}";

但脚本什么也没做。没有错误消息,并且不会替换任何内容:

Foo & Bar

我最终找到了解决方案,您需要在替换部分中转义&符号:

string="Foo & Bar"
echo "${string//&/\&}";

我还没弄清楚的是为什么?为什么脚本没有按预期工作?为什么只需要转义最后一个 & 符号而不是第一个(即${string//\&/\&})。

这是否意味着 & 符号在字符串替换中具有特殊含义或用途?

答案1

这里,&代表匹配的模式:

如果patsub_replacement使用 启用 shell 选项shopt,则任何未加引号的 ' &'实例细绳被替换为匹配部分图案。这是为了重复一个常见的sed习语。

你的扩展,如果没有转义,最终会&用它自己替换“”。

这个功能是bash 5.2 中添加

相关内容