bash 脚本中使用反引号进行命令替换的奇怪输出

bash 脚本中使用反引号进行命令替换的奇怪输出
echo "testing:"
PROXY_URL="/proxyurl/"
proxyUrlSedEscaped=`echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'`
echo                     "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'
echo "$proxyUrlSedEscaped"

echo "???"

上面有以下输出:

testing:
\/proxyurl\/
&proxyurl&
???

为什么最后一个 echo 输出与之前的 echo 输出不同?

该命令通过命令行正确运行: PROXY_URL="/proxyurl/"; echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g',输出:\/proxyurl\/

答案1

根据 Bash 手册(还有 POSIX):

当使用旧式反引号形式的替换时,反斜杠保留其字面含义,除非后面跟着$`\

这意味着执行的命令是`echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g'`,因为双反斜杠已转义为单个反斜杠。然后在 sed 中生成一个文字。sedsed -e 's/[\/&]/\&/g'\&&

您可以使用$(...)-style 命令替换来避免这种情况:

proxyUrlSedEscaped=$(echo "$PROXY_URL" | sed -e 's/[\/&]/\\&/g')

新样式的替换允许任何命令具有其通常的解释。

如果你必须使用,`那么相当怪异的双重转义也可以工作:

proxyUrlSedEscaped=`echo "$PROXY_URL" | sed -e 's/[\/&]/\\\\&/g'`

它会变成\\\\\\然后 sed 会变成\你的。

相关内容