【发布时间】:2020-09-13 18:42:29
【问题描述】:
我正在用 echo 构建一个 shell 脚本。我有类似的东西:
echo "sed -i \"\\|charlie\.url\\s*=\\s*.*|c\\charlie.url = ${CHARLIE_URL}\" foo.conf" >> bar.sh
即将 foo.conf 中包含当前 charlie.url 的行替换为具有新 url 的新行.
我希望 bar.sh 的输出为
sed -i "\|charlie\.url\s*=\s*.*|c\charlie.url = ${CHARLIE_URL}" foo.conf
尽管如此,c\\charlie 被解释为 c \c harlie,而不是
c\charlie,生成以下输出:
sed -i "\|charlie\.url\s*=\s*.*|c
我发现我可以通过使用单引号而不是双引号来防止这种情况,但在这种情况下,${CHARLIE_URL}(我确实需要扩展)不会得到扩展。
我的 echo 参数应该是什么样子?
我正在使用 dash(在 Ubuntu 下是#!/bin/sh),但我也可以使用 bash 或 zsh。
【问题讨论】:
-
如果我们能看到实际数据以及所需的输出/结果会有所帮助
-
请注意
echo的行为极其不可靠;它不仅在 shell 之间变化,而且在每个 shell 的运行时配置之间变化(f/e,在 bash 中,设置xpg_echo或posix标志,或者将您的环境变量设置为启用它们,echo会突然做一些事情不同的)。请改用printf——正如echo的POSIX 标准所建议的那样! -- 如果你想要定义明确、一致的行为。 Stephane 在Why isprintfbetter thanecho? 上的出色回答值得一读。 -
...特别是,请参阅pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html 的应用程序部分,作为上述断言的支持,即
echo的 POSIX 标准明确建议使用printf。 (下面的基本原理部分描述了我们是如何陷入这种境地的)。