Bash 中的 Echo 换行符打印文字 \n
Posted
技术标签:
【中文标题】Bash 中的 Echo 换行符打印文字 \\n【英文标题】:Echo newline in Bash prints literal \nBash 中的 Echo 换行符打印文字 \n 【发布时间】:2012-01-18 00:57:50 【问题描述】:在 Bash 中,尝试过这个:
echo -e "Hello,\nWorld!"
但它不打印换行符,只打印\n
。如何让它打印换行符?
我正在使用Ubuntu 11.04(Natty Narwhal)。
【问题讨论】:
对于那些说“它对我有用”的人来说,echo 的行为在版本之间会有很大差异。有些甚至会打印“-e”作为其输出的一部分。如果您想对任何重要的事情进行可预测的行为,请改用 printf (如@sth's answer)。 我无法在这个答案中得到 any 的建议,因为事实证明,我试图在一个 返回的函数中使用它value,并且函数中的所有 echo(和 printf)消息都被附加到返回值在单独删除换行符之后。这是一个关于此的问题,答案非常彻底:***.com/questions/27872069/… 这就像一个三小时的神秘之旅。 另外值得注意的是:在 Unix 和 Linux Stack Exchange 中,accepted answer 到 How to add new lines when using echo echo -ne "hello\nworld" (你需要 n 标志来解释转义) - 但正如其他人所说,不同的 echo 命令可能有不同的结果! @Konchogecho -n
archlinux 上的手册页条目` -n 不输出尾随换行` 它与解释转义无关
【参考方案1】:
您可以改用printf
:
printf "hello\nworld\n"
printf
的行为比echo
更一致。 echo
的行为在不同版本之间差异很大。
【讨论】:
甚至printf %"s\n" hello world
-- 如果参数太多,printf 将重用格式
OP 询问的是 echo,而不是 printf;和@choroba 下面的答案,它使用 -e 选项,完美地填补了账单。
@JESii:如果您的 echo
恰好支持 -e
选项,则它适合。
对于 echo
的某些版本,-e
只是打印在输出本身中,所以我认为这个答案是完全有效的,因为 echo
在这里不一致(除非我们在谈论特定版本)。
如果 printf 可用,这很好,但与 echo 不同,有时 printf 不在发行版中。【参考方案2】:
确保您在 Bash 中。这四种方式都适合我:
echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo world
【讨论】:
-e 标志为我做了它,它“能够解释反斜杠转义” 我认为-e
参数并不存在于所有 *nix 操作系统上
@kenorb:它存在于 bash 中。它是内置的。
为什么第三个有效?没有 $ 它返回“Hello n world”
正如其他各种提到的 -e 不适用于所有发行版和版本。在某些情况下,它会被忽略,而在其他情况下,它实际上会被打印出来。我不相信这为 OP 修复了它,所以不应该接受答案【参考方案3】:
echo $'hello\nworld'
打印
hello
world
$''
字符串使用ANSI C Quoting:
$'<i>string</i>'
形式的单词被特殊处理。该单词扩展为 string,并按照 ANSI C 标准的规定替换反斜杠转义字符。
【讨论】:
@EvgeniSergeev 不确定你的意思,但它首先对我也不起作用。那是因为我使用了双引号,结果发现这只适用于单引号!在 Mac 上的终端中尝试过。 字符串中的变量没有被展开的问题。 您仍然可以连接双引号字符串。 ` foo="酒吧"; echo $''$foo'efoot'` 这就是我想要的。在 Xenial 上运行良好。 它在GNU bash, version 4.4.23(1)-release (x86_64-pc-msys) W10
上工作就像一个魅力。【参考方案4】:
你总是可以做到echo ""
。
例如,
echo "Hello,"
echo ""
echo "World!"
【讨论】:
echo ""
对我有用,我认为这是打印新行的最简单形式,即使这不能直接回答问题。干杯。
我认为它没有echo -en "\n"
那么明显(因此可能更令人困惑)。
echo
足以获取空行
当您使用read
时,\n
不起作用。但是您的方法适用于添加一行。
我无法在 Mac 上获得其他答案。我最终选择了这个非常明显的解决方案。 :)【参考方案5】:
如果有人发现自己在试图弄清楚为什么同事的脚本不会打印换行符时,他们发现自己的头撞墙,请注意这一点:
#!/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;
【讨论】:
在将变量从方法中回显出来之前,请确保将变量用引号括起来。【参考方案6】:简单输入
echo
换行
【讨论】:
被严重低估的答案,不敢相信这个问题自 2011 年以来已经积累了 20 多个答案,而且没有一个包含这个简单的解决方案。 别名 c='echo ;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;'这是我清除屏幕的唯一方法,谢谢! @Ahi Tuna:请改用控制台键盘快捷键 :) @RSun 我如何在 Chromebook 上的 Debian 终端窗口上执行此操作? @AhiTuna 清屏,输入clear
命令【参考方案7】:
POSIX 7 上的回声
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
未定义,反斜杠是实现定义的:
如果第一个操作数是 -n,或者任何操作数包含
字符,则结果是实现定义的。
除非您有可选的 XSI 扩展。
所以我建议你应该改用printf
,这是明确规定的:
格式操作数应用作 XBD 文件格式表示法中描述的格式字符串 [...]
File Format Notation:
\n
将打印位置移动到下一行的开头。
另外请记住,Ubuntu 15.10 和大多数发行版都将echo
实现为:
help echo
独立的可执行文件:which echo
这可能会导致一些混乱。
【讨论】:
【参考方案8】:str='hello\nworld'
$ echo | sed "i$str"
hello
world
【讨论】:
这实际上是一个很好的答案,因为它适用于字符串连接。太好了! 为什么还要调用第二个程序?这并不是说我们要尝试在 bash 中编写实时应用程序;)但这不是必需的。【参考方案9】:你也可以这样做:
echo "hello
world"
这在脚本内部和命令行中都有效。
在命令行中,按 Shift+Enter 在字符串内进行换行。
这适用于我的 macOS 和 Ubuntu 18.04 (Bionic Beaver) 系统。
【讨论】:
【参考方案10】:我只使用 echo 没有任何参数:
echo "Hello"
echo
echo "World"
【讨论】:
这是错误的,因为Hello
后面是两个换行符,而不仅仅是一个。【参考方案11】:
在 Bash 4.4 中添加了一个新 parameter expansion 来解释转义序列:
$parameter@operator - E operator
扩展是一个字符串,它是参数的值 反斜杠转义序列与
$'…'
引用一样扩展 机制。
$ foo='hello\nworld'
$ echo "$foo@E"
hello
world
【讨论】:
从函数外部打印作为函数内部变量的消息就像一个魅力。【参考方案12】:最好这样做
x="\n"
echo -ne $x
-e 选项将解释转义序列的反斜杠 -n 选项将删除输出中的尾随换行符
PS:命令 echo 具有始终在输出中包含尾随换行符的效果,因此需要 -n 来关闭该功能(并使其不那么混乱)
【讨论】:
echo -ne "hello\nworld" 以获得问题的确切答案:)【参考方案13】:如果您正在编写脚本并将换行符作为其他消息的一部分多次回显,则一个不错的跨平台解决方案是将文字换行符放入如下变量中:
newline='
'
echo "first line$newlinesecond line"
echo "Error: example error message n$newline$usage" >&2 #requires usage to be defined
【讨论】:
【参考方案14】:我的脚本:
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:
【讨论】:
请注意,您可能希望在变量名周围使用 $ ,因为当 shell 找到一个名为 $warningsFound 的变量并打印它而不是两个独立的输出。 @dragon788 也许我遗漏了什么,但变量 IS 实际上称为 $warningsFound ? 我错过了一个字。如果您有一个名为 $warnings 的变量,在某些情况下不使用 $warningsFound,您最终可能会得到 $warnings + "Found" 的内容,而不是您想要的变量。【参考方案15】:对于那些不能使用任何这些解决方案并需要从他们的函数中获取返回值的人来说,这里还有一个条目:
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)
【讨论】:
【参考方案16】:你也可以使用带有大括号的 echo,
$ (echo hello; echo world)
hello
world
【讨论】:
在 .sh 文件中调用时出现意外标记 `(' 附近的语法错误 试试echo hello; echo world
或者“echo hello && echo world”或者只是:“echo hello echo world”
解释一下。【参考方案17】:
有时您可以传递多个用空格分隔的字符串,它将被解释为\n
。
例如,当使用 shell 脚本进行多行通知时:
#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
【讨论】:
这是不正确的。它永远不会被解释为\n
。它被解释为程序的单独参数,程序本身可能会在新行上显示该参数,但这并不意味着它在任何时候都转换为\n
,并且完全依赖于程序。
【参考方案18】:
这让我到了那里......
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]
【讨论】:
解释一下。例如,要点/想法是什么?请通过editing your answer 回复,而不是在 cmets 中(without "Edit:"、"Update:" 或类似的 - 答案应该看起来像是今天写的)。【参考方案19】:其他解决方案:
在某些情况下,您必须回显多行长内容(例如代码/配置)
例如:
用于生成代码/配置的 Bash 脚本echo -e
,
printf
可能有一些限制
您可以使用一些特殊的字符作为占位符作为换行符(例如~
)并在使用tr
创建文件后替换它:
echo $content | tr '~' '\n' > $targetFile
它需要调用另一个程序 (tr
),这应该没问题,IMO。
【讨论】:
这是一个糟糕的解决方案。在这种情况下,绝对不需要调用tr
。此外,如果文本中已经包含~
怎么办?以上是关于Bash 中的 Echo 换行符打印文字 \n的主要内容,如果未能解决你的问题,请参考以下文章