如何使回声解释反斜杠转义而不打印尾随换行符?

时间:2012-05-14 01:21:32

标签: bash echo

我想在bash中使用echo打印出一串字符,后面只有一个回车符。我查看了手册页,发现echo -e将使echo解释反斜杠转义字符。使用它我可以说echo -e 'hello\r',它会像这样打印

$>echo -e 'hello\r'
 hello
$>

所以看起来它正确地处理了回车。我还发现手册页中的echo -n将阻止echo插入换行符,看起来它在我这样做时有效

$>echo -n 'hello\r'
 hello\r$>

我遇到的问题是将-e-n结合起来。我已经尝试了echo -e -n 'hello\r'echo -n -e 'hello\r'echo -en 'hello\r'echo -ne 'hello\r'中的每一个,并且没有像这样打印:

$>echo -ne 'hello\r'
$>

我在这里缺少什么,或-e-n选项不能一起使用?

5 个答案:

答案 0 :(得分:15)

我认为它有效,你只是没有看到它。这是你的命令:

$> echo -ne 'hello\r' 

由于回车符(\r),这会将光标留在写入hello的终端上同一行的开头 - 这意味着下一个输出到的位置终端将被写入。因此,如果您的实际提示超过此处显示的$>,则会完全覆盖hello

这个序列可以让你看到实际发生的事情:

echo -ne 'hello\r'; sleep 5; echo 'good-bye'

但为了更好地移植到其他shell,我会避免在echo上使用这样的选项。这些纯粹是bashisms,不受POSIX标准的支持。但是,printf内置函数由POSIX指定。因此,如果您想显示没有换行符和解析反斜杠序列的字符串,您可以使用它:

printf '%s\r' 'hello'

答案 1 :(得分:10)

echo命令有许多不同的实现。大多数shell中都有一个(每个shell都有不同的行为),/bin/echo的行为因系统而异。

而不是echo,请使用printf。它内置于bash中,并且可作为外部命令使用,并且其行为在各实现中更加一致。 (主要变化是GNU coreutils printf识别--help--version选项。)

只需使用:

printf 'hello\r'

答案 2 :(得分:6)

我希望您向我介绍printf

OP,见printfprintf。这是OP ......

每当您尝试使用BASH中的输出执行任何异常时,您应切换到printf。实际上,我一直使用printf,因此我的脚本将在BASH和Kornshell下运行。

尽管BASH和Kornshell的相同度为99%,但echo命令却不同。在Kornshell中,它已被弃用,您应该使用内置print。但是,BASH中没有print。使用printf解决了这个问题,因为它在两个shell中都是相同的(有点)。

由于printf不会自动以\n结束每一行,因此您无需担心如何阻止附加\n。哎呀,如果你想要\n,你必须自己动手。在你的情况下:

printf `hello\r`

但是,出于安全原因,您应该这样做:

printf '%s\r' 'hello'

当我使用printf时,这是我习惯的习惯。想象一下,如果我想要打印$FOO,我这样做:

printf "$FOO\n"

这通常会有效,但如果$FOO在开头有短划线,或者其中有%符号,该怎么办?以上不会做我想做的事。但是,如果我这样做:

printf '%s\n' "$FOO"

无论$FOO中包含$FOO,都会打印{{1}}。

答案 3 :(得分:2)

POSIX 7 says it is not possible

  

如果第一个操作数是-n,或者如果任何操作数包含反斜杠字符,则结果是实现定义的。

例如在Ubuntu 12.04上:

  • Bash的内置echo echo -e '\n'解释换行符,echo '\n'没有。
  • /bin/sh的内置echo没有-e选项,即使没有它也会解释换行符。写Makefile时,这可以是字节,默认情况下使用/bin/sh

POSIX 7解决方案:printf正如其他人所提到的那样。

答案 4 :(得分:1)

引用。这是未来的潮流。总是引用。

echo -ne 'hello\r'

如果在要扩展的内部放置一个变量,请使用双引号。