Bash中的回声换行符打印文字\n

如何打印换行符?这只打印\n

$ echo -e "Hello,\nWorld!"Hello,\nWorld!
3054179 次浏览

确保你在Bash。

$ echo $0bash

这四种方法都适合我:

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

使用printf代替:

printf "hello\nworld\n"

printf在不同环境中的行为比echo更一致。

echo $'hello\nworld'

印刷品

helloworld

$''字符串使用ANSI C报价

$'string'形式的单词被特殊处理。该单词扩展到字符串,用ANSI C标准指定的反斜杠转义字符替换。

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

如果有人发现自己把头撞在墙上,试图弄清楚为什么同事的脚本不会打印换行符,请注意:

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

如上所述,方法的实际运行本身可能被包裹在一个回声中,它取代了方法本身中可能存在的任何回声。显然,为了简洁起见,我淡化了这一点。它不那么容易被发现!

然后你可以告诉你的同伴,执行函数的更好方法是这样的:

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

如果前面的答案不起作用,并且需要从它们的函数中获取返回值:

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)

你总是可以做echo ""

例如,

echo "Hello,"echo ""echo "World!"

你也可以使用带括号的回声,

$ (echo hello; echo world)helloworld

我的脚本:

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"

只需点击输入即可插入该跳转。现在的输出是:

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

回声上的POSIX 7

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

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

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

除非您有可选的XSI扩展。

所以我建议你应该使用#0,这是明确规定的:

格式操作数应用作XBD文件格式表示法中描述的格式字符串[…]

文件格式符号

\n将打印位置移动到下一行的开头。

还要记住,Ubuntu 15.10和大多数发行版都实现了echo

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

这可能会导致一些混乱。

这可以更好地作为

x="\n"echo -ne $x

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

PS:命令echo具有始终在输出中包含尾随换行符的效果,因此需要-n来关闭该东西(并使其不那么混乱)

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

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

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

在Bash 4.4中添加了一个新的参数展开来解释转义序列:

${parameter@operator} - E operator

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

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

你也可以这样做:

echo "helloworld"

这在脚本内部和命令行中都有效。

在命令行上,按Shift+输入在字符串中执行换行符。

这适用于我的macOS和我的ubuntu 18.04(Bionic Beaver)系统。

附加解决方案:

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

例如:

  • 用于生成代码/配置的Bash脚本

echo -eprintf可能有一些限制

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

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

它需要调用另一个程序(tr),这应该没问题,IMO。

只需输入

echo

换一条新线路

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

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

我只是使用回声没有任何参数:

echo "Hello"echoecho "World"

这让我在那里……

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]

要使用echo打印新行,请使用:

echo

echo -e '\n'

仅针对提出的问题(不是特殊字符等),仅将双引号更改为单引号。

echo -e 'Hello,\nWorld!'

结果在:

Hello,World!

使用jq

$ jq -nr '"Hello,\nWorld"'Hello,World