我正在编写一个使用echo的Shell脚本。我有如下内容:
即替换在foo.conf中包含当前charlie.url的行(不一定在开头,因为该行可能被注释)为一个新的URL的新行。
我期望输出结果写入到bar.sh文件中。
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的运行时配置之间也有所不同(例如,在bash中,设置xpg_echo
或posix
标志,或者将您的环境变量设置为启用它们,echo
会突然执行不同的操作)。如果您想要定义良好、一致的行为,请使用printf
——正如POSIX标准对echo
的建议!Stephane在为什么printf
比echo
更好?上的出色回答值得一读。 - Charles Duffyprintf
而不是echo
。(下面的“基本原理”部分描述了我们如何陷入这种情况)。 - Charles Duffy