在sh中,echo -e命令不支持反斜杠转义。

5

我有一个shell脚本,希望在不同的Linux服务器上运行。当我使用-e选项和转义字符运行echo命令时,在Ubuntu 12.04或Ubuntu 11.04上的sh shell中它没有按预期执行。我们现在正在使用的两个服务器分别是CentOS 5.3和Ubuntu 12.04,我希望该脚本能在这两个服务器上正确运行。当我在这两台服务器上的bash中运行以下命令时,可以得到预期的输出:

$ echo -e "line1\nline2"
line1
line2

在CentOS机器上使用sh运行相同的命令也会产生正确的输出。但是在Ubuntu 12.04或11.04上使用sh运行该命令会产生以下输出:

$ echo -e "line1\nline2"
-e line1
line2

如果我在Ubuntu上使用sh运行以下命令,它会自动解释转义字符。

$ echo "line1\nline2"
line1
line2

脚本需要在sh shell中运行,并应该能够在不同的机器上移植。有什么解决方案吗?我也非常感谢提供一些解释为什么或如何发生这种情况的文档链接。
2个回答

6
在Ubuntu中,sh shell实际上是dash。它内置的echo命令没有-e选项(因此它只是简单地回显),或者说,它没有关闭转义行为的方法。请使用/bin/echo代替。要检查您正在使用的shell,请尝试echo $SHELL
$ echo $SHELL
/bin/bash

2
@MarwanAlsabbagh /bin/echo 不是一个好的替代品。如果你真的想使用 /bin/sh,请使用 printf,否则请使用其他 shell。 - ormaaj
惊人:POSIX 7规定反斜线转义的效果是不确定的:“要写入标准输出的字符串。如果第一个操作数是-n,或者任何操作数包含<backslash>字符,则结果由实现定义。”我在很多时候都依赖它!来源 - Ciro Santilli OurBigBook.com

0

echo 在不同实现之间极不一致;如果你需要在非平凡应用中保持一致的行为(例如转义序列),请使用 printf(并记得显式添加最后的 \n):

$ printf "line1\nline2\n"
line1
line2

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接