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

sea*_*son 14 bash echo

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

$>echo -e 'hello\r'
 hello
$>
Run Code Online (Sandbox Code Playgroud)

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

$>echo -n 'hello\r'
 hello\r$>
Run Code Online (Sandbox Code Playgroud)

我遇到的问题是在这两个相结合-e-n.我试过每个echo -e -n 'hello\r',echo -n -e 'hello\r',echo -en 'hello\r',和echo -ne 'hello\r'没有东西印像这样:

$>echo -ne 'hello\r'
$>
Run Code Online (Sandbox Code Playgroud)

有没有我在这里缺少的东西,或者这些-e-n选项不能一起使用?

Mar*_*eed 16

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

$> echo -ne 'hello\r' 
Run Code Online (Sandbox Code Playgroud)

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

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

echo -ne 'hello\r'; sleep 5; echo 'good-bye'
Run Code Online (Sandbox Code Playgroud)

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

printf '%s\r' 'hello'
Run Code Online (Sandbox Code Playgroud)


Kei*_*son 10

echo命令有许多不同的实现.大多数shell中都有一个(每个shell都有不同的行为),并且/bin/echo从一个系统到另一个系统的行为差异很大.

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

只需使用:

printf 'hello\r'
Run Code Online (Sandbox Code Playgroud)

  • +1`echo`适用于打印单行,但只要您使用任何特殊选项或转义它就会变得不可靠且不可移植.`printf`对于这样的事情要好得多. (2认同)

Dav*_* W. 6

我希望你能向你介绍printf.

OP,见面printf.printf.这是OP ......

无论何时您尝试使用BASH中的输出执行任何异常操作,都应切换到printf.事实上,我printf一直在使用,所以我的脚本将在BASH和Kornshell下运行.

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

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

printf `hello\r`
Run Code Online (Sandbox Code Playgroud)

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

printf '%s\r' 'hello'
Run Code Online (Sandbox Code Playgroud)

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

printf "$FOO\n"
Run Code Online (Sandbox Code Playgroud)

这通常会起作用,但如果$FOO在开头有一个破折号,或者有一个%标志.以上不会做我想做的事.但是,如果我这样做:

printf '%s\n' "$FOO"
Run Code Online (Sandbox Code Playgroud)

这将打印出来,$FOO无论$FOO它有什么.