如何使用 echo 打印“-e”?

Hig*_*ory 8 shell echo

我知道这echo -e不是一个普通的命令。我已经尝试过了echo '-e'echo \-e但它们仍然不起作用。

Cha*_*ffy 25

最好的解决方案不是使用echo,而是使用printf

printf '%s\n' -e
Run Code Online (Sandbox Code Playgroud)

这适用于任意变量:

var=-e
printf '%s\n' "$var"
Run Code Online (Sandbox Code Playgroud)

...意味着您不需要根据值将是echod的知识在代码的其他地方进行任何特殊的准备/修改。


顺便说一下,POSIX shell 命令规范echo承认它在实现时是不可移植的,并包含关于该主题的注释:

除非 -n(作为第一个参数)和转义序列都被省略,否则不可能在所有 POSIX 系统中便携地使用 echo。

printf 实用程序可移植地用于模拟 echo 实用程序的任何传统行为,如下所示(假设 IFS 具有其标准值或未设置):

本卷 POSIX.1-2008 中历史性的 System V 回声和对 XSI 实现的要求等价于:

printf "%b\n" "$*"
Run Code Online (Sandbox Code Playgroud)

BSD 回声相当于:

if [ "X$1" = "X-n" ]
then
    shift
    printf "%s" "$*"
else
    printf "%s\n" "$*"
fi
Run Code Online (Sandbox Code Playgroud)

鼓励新应用程序使用 printf 而不是 echo。

(强调)。


也就是说,在 GNU 系统上,存在另一种选择:请求符合标准的行为。

$ POSIXLY_CORRECT=1 /bin/echo -e
-e
Run Code Online (Sandbox Code Playgroud)

  • @hvd,恰恰相反。为了按规定执行,`echo` 需要发出所有参数,而没有以与标准相反的方式定义的行为。因此——与 POSIX 规范涵盖的几乎所有其他命令行工具不同——`echo` 实际上_指定_未给出参数的行为:打印它们。在不破坏规范的情况下没有添加新标志的空间。 (2认同)
  • @hvd,...就此而言,请参阅`OPTIONS` 部分,其中以黑白形式列出:`Implementations shall not support any options`。 (2认同)

jim*_*mij 9

bashecho内置行为可能取决于 bash 版本。它还取决于环境(POSIXLY_CORRECTSHELLOPTSBASHOPTS变量)、选项(posixxpg_echo)、构建选项和argv[0]shvs bash)。这里测试了GNU bash 4.2.53(1),默认构建,默认选项,空环境,调用为bash. 也适用于zsh 5.0.5.

  • Jens:因为 OP 询问如何使用 `echo` 命令进行操作。态度没必要。 (7认同)
  • 为什么这些丑陋到骨头混淆的“解决方法”会收到赞成票?下面的 Charles Duffy 有正确的答案:使用 printf 并一劳永逸地忘记这些问题。 (3认同)

mur*_*uru 9

随着GNUecho-e与字符的ASCII码:

$ /bin/echo -e '\055'e
-e
Run Code Online (Sandbox Code Playgroud)

055是八进制 ASCII 数字-(参见man ascii快速参考)。

  • 其实,是!导出`POSIXLY_CORRECT=1` 将导致GNU 的`/bin/echo` 的POSIX 兼容行为。 (2认同)