Bash中的Echo换行符输出文字\ n


2359

在Bash中,尝试了以下操作:

echo -e "hello\nworld"

但它不会仅打印换行符\n。如何使其打印换行符?

我正在使用Ubuntu 11.04。


263
对于那些说“对我有用”的人,回声的行为在不同版本之间有很大差异。有些甚至会在输出中打印“ -e”。如果您希望任何无关紧要的行为具有可预测的行为,请改用printf(如@sth的回答)。
戈登·戴维森

6
我在此答案中无法获得任何建议,因为事实证明,我试图在返回值的函数中使用它,并且该函数中的所有回显(和printf)消息都被附加到分别除去换行符后的返回值。这是一个与此有关的问题,答案非常彻底:stackoverflow.com/questions/27872069/…这就像是三个小时的神秘之旅。
aliteralmind

8
同样值得注意:在unix和Linux堆栈交易所接受的答案,以使用回声时,如何增加新线路
格雷厄姆佩兰

@GrahamPerrin,感谢您提供的链接,确实提供了一个非常详细的好答案!我认为这比下面的答案要好。
康斯坦丁

2
echo -ne“ hello \ nworld”(您需要使用n标志来解释转义符)-但是正如其他人所说,不同的echo命令可能会有不同的结果!
Konchog

Answers:


2872

您可以printf改用:

printf "hello\nworld\n"

printfecho。具有更一致的行为。echo不同版本之间行为的差异很大。


49
甚至printf %"s\n" hello world-如果给出太多参数,printf将重用格式
glenn jackman 2011年

28
OP问回声,不是printf。和@choroba在下面的答案(使用-e选项)完全可以满足要求。
JESii 2015年

56
@JESii:非常适合您echo碰巧支持该-e选项的情况。
2015年

11
对于某些版本的echo-e仅会在输出本身中进行打印,因此我认为此答案是完全有效的,因为echo此处不一致(除非我们在谈论特定版本)。
Tejas Manohar

14
如果可以使用printf,这很好,但是与echo不同,有时printf不在发行版中。
bigtunacan

1711

你确定你在狂欢吗?为我工作,所有四种方式:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world

368
-e标志为我做到了,它“启用对反斜杠转义
符的

21
我认为-eparam并非在所有* nix操作系统上都存在
kenorb 2013年

12
@kenorb:它存在于bash中。它是内置的。
choroba

为什么第三个有效?如果没有美元,它将返回“ Hello n world”
Evan Donovan

21
正如其他各种提到的那样,-e不适用于所有发行版和版本。在某些情况下,它会被忽略,而在其他情况下,它实际上会被打印出来。我不认为这会为OP解决问题,因此不应该接受答案
csga5000 '16

578
echo $'hello\nworld'

版画

hello
world

$''字符串使用ANSI C引用

表格中的单词经过特殊处理。该单词扩展为string,并按ANSI C标准的规定替换了反斜杠转义的字符。$'string'


15
@EvgeniSergeev不确定您的意思,但它首先对我也不起作用。那是因为我使用了双引号,结果证明这仅适用于单引号!在Mac的终端机上尝试过。
trss

11
字符串中的变量未扩展的问题。
willemdh '16

您仍然可以连接双引号字符串。`foo =“ bar”; echo $''$ foo'efoot'`
Kamafeather



41

如果有人发现自己在墙上撞头试图找出为什么同事的脚本不会打印换行符的机会,请注意->

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

echo $(GET_RECORDS);

如上所述,方法的实际运行本身可以包装在回声中,该回声将取代方法本身中可能存在的任何回声。显然,为了简洁起见,我对此不屑一顾,发现它并不是那么容易!

然后,您可以通知您的同志,执行功能的更好方法如下:

#!/bin/bash
function GET_RECORDS()
{
   echo -e "starting\n the process";
}

GET_RECORDS;

在将变量回显到方法之前,请确保将变量用引号引起来。
ingyhere

23

这在Raspbian中对我有效,

echo -e "hello\\nworld"

2
在Windows 7上的GitBash中也对我有用;-)
Big Rich

3
一个反斜杠就足够了
Felix D.

23

POSIX 7回显

http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html

-e 未定义,反斜杠是实现定义:

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

除非您具有可选的XSI扩展名。

因此,我建议您改用以下方式printf

格式操作数应用作XBD文件格式符号[...]中描述的格式字符串

文件格式符号

\ n <newline>将打印位置移至下一行的开头。

还请记住,Ubuntu 15.10和大多数发行版都实现echo为:

  • 一个Bash内置的: help echo
  • 一个独立的可执行文件: which echo

可能会导致一些混乱。


17

只需输入

echo

换行


3
答案被大大低估了,无法相信自2011年以来这个问题已经积累了20多个答案,而且其中没有一个包含这种简单的解决方案。
Prometheus

别名c ='echo; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声; 回声;' 这是清除屏幕的唯一方法,谢谢!
阿希金枪鱼

@Ahi Tuna:请改用控制台键盘快捷键:)
R Sun

@RSun,我将如何在Chromebook的Debian终端窗口中执行此操作?
阿希金枪鱼

1
@AhiTuna清除;或ctrl + l;
Mike Seeds

16
str='hello\nworld'
$ echo | sed "i$str"
hello
world

这实际上是一个很好的答案,因为它适用于字符串连接。大!
LavaScornedOven

1
为什么要打扰另一个程序呢?不是我们试图用bash;)编写一个实时应用程序,而是不必要的。
Felix D.

这确实是一个很好的答案,无论如何都应在任何地方使用。您保存了我的当日朋友@alinsoar
Kashyap Kotak


6

您也可以这样做:

echo "hello
world"

这既可以在脚本内运行,也可以从命令行运行。
在命令行中,按Shift+ Enter在字符串内进行换行。

这适用于我的macOS和Ubuntu 18.04


当您按Ènter`时如何键入换行符而无需外壳程序运行命令?
Xenos

@Xenos这在脚本中效果很好。并且在控制台中,只需单击Shift + Enter即可添加新行,以避免让Shell运行未完成的命令。
vinzee

5

对于那些无法与任何这些解决方案配合使用并且需要从其函数中获取返回值的用户,这里还有一个条目:

function foo()
{
    local v="Dimi";
    local s="";
    .....
    s+="Some message here $v $1\n"
    .....
    echo $s
}

r=$(foo "my message");
echo -e $r;

只有这个技巧在我正在使用此bash的Linux中起作用:

GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)

希望它可以帮助有类似问题的人。


4

我的剧本:

echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings

输出:

WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:

在我的bash脚本上,我一直为你生气,直到我尝试为止:

echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"

只需按Enter键即可在其中插入该跳转。现在的输出是:

WARNING : 2 WARNINGS FOUND:
Warning, found the following local orphaned signature file:

4
请注意,您可能要在变量名周围使用$ {},因为这样做会导致外壳程序找到名为$ warningsFound的变量并打印该变量而不是打印两个单独的输出时的行为,从而产生真正的怪异行为。
dragon788 '16

@ dragon788也许我缺少了一些东西,但是变量IS实际上叫做$ warningsFound吗?
psynnott

2
我错过了一个字。如果您有一个名为$ warnings的变量,在某些情况下,如果不使用$ {warningsFound},则可能会以$ warnings +“ Found”的内容结尾,而不是想要的变量。
dragon788 '17


3

最好这样做

x="\n"
echo -ne $x

-e选项将解释转义符的转义序列
-n选项将删除输出中的尾随换行符

PS:命令回声的效果是始终在输出中包含尾随换行符,因此需要-n来关闭该功能(并减少混乱)


回声-ne“你好\ nworld”的问题的确切答案:)
Dhwanit

3

添加了一个新的 参数扩展bash 4.4用于解释转义序列:

${parameter@operator} - E operator

扩展名是一个字符串,它是参数的值,反斜杠转义序列的扩展方式与$'…'引用机制相同。

$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world

2

如果您正在编写脚本,并且会多次将换行符作为其他消息的一部分回显,那么一个很好的跨平台解决方案是将文字换行符放在变量中,如下所示:

newline='
'

echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined

0

有时您可以传递多个由空格分隔的字符串,它将被解释为\n

例如,当使用shell脚本进行多行通知时:

#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`

这是不正确的。它永远不会被解释为\n。它被解释为程序的单独参数,程序本身可以在新行上显示该参数,但这并不意味着它\n在任何时候都已转换为参数,并且完全依赖于程序。
Score_Under 19'Mar

0

在bash配置文件(MacOx,iTerm)中用作别名时,我必须用双引号将文本引起来。

alias helloworld="echo -e \"hello \n world\""

0

这把我带到了那里。

outstuff=RESOURCE_GROUP=[$RESOURCE_GROUP]\\nAKS_CLUSTER_NAME=[$AKS_CLUSTER_NAME]\\nREGION_NAME=[$REGION_NAME]\\nVERSION=[$VERSION]\\nSUBNET-ID=[$SUBNET_ID]
printf $outstuff

产量:

RESOURCE_GROUP=[akswork-rg]
AKS_CLUSTER_NAME=[aksworkshop-804]
REGION_NAME=[eastus]
VERSION=[1.16.7]
SUBNET-ID=[/subscriptions/{subidhere}/resourceGroups/makeakswork-rg/providers/Microsoft.Network/virtualNetworks/aks-vnet/subnets/aks-subnet]

-1

我只是使用echo no arguments

echo "Hello"
echo
echo "World"

-2

附加解决方案:

在某些情况下,您必须回显长内容的多行(例如代码/配置)

例如 :

  • 一个Bash脚本来生成代码/配置

echo -eprintf可能会有一些限制

您可以使用一些特殊的char作为占位符作为换行符(例如~),并在使用以下文件创建文件后将其替换tr

echo ${content} | tr '~' '\n' > $targetFile

它需要调用另一个tr应该适合IMO的程序()。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.