ChatGPT解决这个技术问题 Extra ChatGPT

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

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

$ echo -e "Hello,\nWorld!"
Hello,\nWorld!
对于那些说“它对我有用”的人来说,回声的行为在版本之间有很大的不同。有些甚至会打印“-e”作为其输出的一部分。如果您想对任何不平凡的事情进行可预测的行为,请改用 printf (如@sth's answer)。
我无法让此答案中的 任何 建议起作用,因为事实证明,我试图在 返回值 的函数中使用它,并且所有在单独去除换行符之后,函数中的 echo(和 printf)消息被附加到返回值。这是一个与此相关的问题,答案非常详尽:stackoverflow.com/questions/27872069/… 这就像一个三小时的神秘之旅。
同样值得注意的是:在 Unix & Linux Stack Exchange,使用 echo 时如何添加新行accepted answer
echo -ne "hello\nworld" (您需要 n 标志来解释转义) - 但正如其他人所说,不同的 echo 命令可能有不同的结果!
@Konchog echo -n archlinux 上的手册页条目` -n 不输出尾随换行符` 它与解释转义无关

M
Mateen Ulhaq

请改用 printf

printf "hello\nworld\n"

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


甚至 printf %"s\n" hello world - 如果参数太多, printf 将重用格式
OP 询问了 echo,而不是 printf;和下面@choroba 的答案,它使用 -e 选项,完美地填补了账单。
@JESii:如果您的 echo 恰好支持 -e 选项,它就适合。
对于某些版本的 echo-e 只是打印在输出本身中,所以我认为这个答案是完全有效的,因为 echo 在这里不一致(除非我们谈论的是特定版本)。
如果 printf 可用,这很好,但与 echo 不同,有时 printf 不在发行版中。
c
choroba

确保你在 Bash 中。

$ echo $0
bash

所有这四种方式都对我有用:

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

-e 标志为我做了它,它“能够解释反斜杠转义”
我认为所有 *nix 操作系统上都不存在 -e 参数
@kenorb:它存在于 bash 中。它是内置的。
为什么第三个有效?没有 $ 它返回“Hello n world”
正如其他各种 -e 所述,不适用于所有发行版和版本。在某些情况下,它会被忽略,而在其他情况下,它实际上会被打印出来。我不相信这为 OP 修复了它,所以不应该被接受
R
Rory O'Kane
echo $'hello\nworld'

印刷

hello
world

$'' 字符串使用 ANSI C Quoting

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


@EvgeniSergeev 不确定你的意思,但它首先对我也不起作用。那是因为我使用了双引号,结果发现这只适用于单引号!在 Mac 上的终端中尝试过。
字符串中的变量没有被扩展的问题。
您仍然可以连接双引号字符串。 ` foo="酒吧";回声$''$foo'efoot'`
这就是我想要的。在 Xenial 上运行良好。
它像魅力一样在 GNU bash, version 4.4.23(1)-release (x86_64-pc-msys) W10 上起锅。
P
Peter Mortensen

你总是可以做echo ""

例如,

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

echo "" 对我有用,我认为这是打印新行的最简单形式,即使这不能直接回答问题。干杯。
我认为它比 echo -en "\n" 不那么明显(因此可能更令人困惑)。
echo 足以获得空行
当您使用 read 时,\n 不起作用。但是您的方法适用于添加一行。
我无法在 Mac 上获得其他答案。我最终选择了这个非常明显的解决方案。 :)
P
Peter Mortensen

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

#!/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;

确保在将变量从方法中回显之前用引号括起来。
v
vinzee

只需键入

echo

换一条新线


被严重低估的答案,不敢相信这个问题自 2011 年以来已经积累了 20 多个答案,而且没有一个包含这个简单的解决方案。
别名 c='echo ;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;'这是我清除屏幕的唯一方法,谢谢!
@Ahi Tuna:请改用控制台键盘快捷键 :)
在清屏时,Ctrl+L 也会在大部分终端上清屏。
@AhiTuna 清除屏幕,只需输入 clear 命令
C
Ciro Santilli Путлер Капут 六四事

POSIX 7 上的回声

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

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

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

除非您有可选的 XSI 扩展。

因此,我建议您改用 printf,这是明确指定的:

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

File Format Notation

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

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

内置 Bash:帮助回显

一个独立的可执行文件: which echo

这可能会导致一些混乱。


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

这实际上是一个很好的答案,因为它适用于字符串连接。伟大的!
为什么还要调用第二个程序?这并不是说我们正在尝试用 bash 编写实时应用程序;)但这不是必需的。
P
Peter Mortensen

你也可以这样做:

echo "hello
world"

这既适用于脚本内部,也适用于命令行。

在命令行上,按 Shift+Enter 在字符串内进行换行。

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


P
Peter Mortensen

在 Bash 4.4 中添加了一个 new parameter expansion 来解释转义序列:

${parameter@operator} - E 运算符扩展是一个字符串,它是带有反斜杠转义序列的参数值,扩展为使用 $'...' 引用机制。

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

从函数外部打印作为函数内部变量的消息就像一个魅力。
P
Peter Mortensen

我只使用 echo 没有任何参数:

echo "Hello"
echo
echo "World"

这是错误的,因为 Hello 后跟两个换行符,而不仅仅是一个。
A
Anish

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

echo

或者

echo -e '\n'

尝试“回声”
D
Dhwanit

这可以更好地做到

x="\n"
echo -ne $x

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

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


echo -ne "hello\nworld" 以获得问题的确切答案:)
s
skiggety

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

newline='
'

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

P
Peter Mortensen

我的脚本:

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" 的内容,而不是您想要的变量。
P
Peter Mortensen

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

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)

G
Gary Tessman

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

echo -e 'Hello,\nWorld!'

结果是:

Hello,
World!

A
Avinash Raj

您也可以使用带有大括号的 echo,

$ (echo hello; echo world)
hello
world

在 .sh 文件中调用时,意外标记 `(' 附近的语法错误
试试echo hello; echo world
或“回声你好&&回声世界”或只是:“回声你好回声世界
一个解释将是有序的。
J
Joe Healy

这让我到了那里......

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 回复,而不是在评论中(没有“编辑:”、“更新:”或类似内容 - 答案应该看起来好像是今天写的)。
当您无法添加引号时,这是一个很好的用途!
H
Hunter Frazier

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

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

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

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

使用 jq

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

P
Peter Mortensen

附加解决方案:

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

例如:

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

echo -eprintf 可能有一些限制

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

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

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


这是一个糟糕的解决方案。在这种情况下,绝对不需要调用 tr。此外,如果文本已经包含 ~ 怎么办?