echo -e 反斜杠转义在 sh 中不受尊重

Posted

技术标签:

【中文标题】echo -e 反斜杠转义在 sh 中不受尊重【英文标题】:echo -e backslash escapes not being respected in sh 【发布时间】:2012-10-11 21:52:05 【问题描述】:

我有一个希望在不同 Linux 服务器上运行的 shell 脚本。当我使用 -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 中运行,并且应该可以跨不同的机器移植。任何解决方案。我也非常感谢一些文档的链接,这些文档解释了这些事情发生的原因或方式。

【问题讨论】:

【参考方案1】:

Ubuntu 中的sh shell 是dash。它的内置回显没有-e 选项(因此它只是回显它,如您所见),或者更确切地说,它没有办法关闭转义行为。

请改用/bin/echo

要检查您使用的外壳,请尝试echo $SHELL

$ echo $SHELL
/bin/bash

【讨论】:

@MarwanAlsabbagh /bin/echo 不是一个好的选择。如果你真的想使用/bin/sh,使用printf,否则使用不同的shell。 惊人:POSIX 7 指定反斜杠转义的效果是不确定的:“要写入标准输出的字符串。如果第一个操作数是 -n,或者任何操作数包含 字符,结果由实现定义。”我已经依赖了很多次了! source【参考方案2】:

echo 在实现之间完全不一致;如果您需要非平凡应用程序的一致行为(例如转义序列),请改用printf(并记住明确添加最后一个 \n):

$ printf "line1\nline2\n"
line1
line2

【讨论】:

以上是关于echo -e 反斜杠转义在 sh 中不受尊重的主要内容,如果未能解决你的问题,请参考以下文章

分界符 EOF 不使用反斜杠转义的技巧

正则表达式格式

Django URL中r的意思

为什么String.raw可以处理双反斜杠但是常规转义不能?

sed命令反斜杠的转义

转义反斜杠在javascript中打印两个反斜杠