摘要:echo对指令的解析没有严格的标准,不同发行版下的echo的行为可能不同,这给脚本的执行带来了变数。为了增强脚本的普适性,我们应该尽量用printf代替echo。

问题描述

echo有多个实现版本,不同的shell程序自带的echo可能不同,不同的操作系统甚至同一操作系统的不同版本所携带的echo也可能不同。这些echo在解释转义字符串时的行为并不一致。

以作者所用的服务器(Linux VM-0-6-ubuntu 5.4.0-72-generic #80-Ubuntu SMP Mon Apr 12 17:35:00 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux)为例。对于如下的脚本:

# test.sh
echo -e "aaa\naaa"
echo -E "aaa\naaa"
echo "aaa\naaa"

如果使用bash解释,输出结果如下:

aaa
aaa
aaa\naaa
aaa\naaa

如果使用sh解释,输入结果如下:

-e aaa
aaa
-E aaa
aaa
aaa
aaa

显然,sh版本的echo并没有实现-e-E选项。

解决方案

如果追求脚本的可迁移性,使用printf代替echo是一个明智的选择。printf的表现在各个平台上具有一致性,不存在兼容问题。