Bash中的Echo newline打印文字\n

Ser*_*gey 2171 bash newline echo

在Bash中,试过这个:

echo -e "hello\nworld"
Run Code Online (Sandbox Code Playgroud)

但它不会仅打印换行符\n.如何让它打印换行符?

我正在使用Ubuntu 11.04.

sth*_*sth 2649

你可以printf改用:

printf "hello\nworld\n"
Run Code Online (Sandbox Code Playgroud)

printf比一致行为更一致echo.echo不同版本之间的行为差别很大.

  • @JESii:如果你的`echo`碰巧支持`-e`选项,它就适合. (52认同)
  • 甚至`printf%'s \n"hello world` - 如果给出太多参数,printf将重用该格式 (46认同)
  • OP询问回声,而不是printf; 和@ choroba的答案如下,使用-e选项,完全填补了账单. (23认同)
  • 如果printf可用,这是好的,但不像echo,有时printf不在发行版上. (13认同)
  • 对于某些版本的`echo`,`-e`只是打印在输出本身,所以我认为这个答案是完全有效的,因为`echo`在这里不一致(除非我们讨论的是特定的版本). (10认同)
  • @bigtunacan如果你使用的是请求者指定的bash,那么printf是一个内置命令,并附带shell(参见"SHELL BUILTIN COMMANDS"下的`man bash`).在这种情况下,它不依赖于发行版. (8认同)
  • @bigtunacan即使OP没有说他们正在使用Bash和Ubuntu,[`printf`命令已经标准了很长一段时间](http://pubs.opengroup.org/onlinepubs/7908799/xcu/printf .html),并且作为可执行文件存在,以防一个shell没有内置.[`printf`被认为是便携,可靠的选择.](https://unix.stackexchange.com/q/65803)你说"不像echo有时printf不在发行版上" - 是否有真实的例子类似Unix的(即使一般不符合POSIX的)操作系统,人们实际使用的,没有`printf`命令? (6认同)
  • @Wasabi:“%”不是由“printf”打印的,它是由 zsh 作为其命令提示符的一部分打印的。Bash 使用 `$` 或者更复杂的东西来代替,这就是它看起来与 bash 不同的原因。`printf` 两次打印相同的内容,然后 shell 打印它的命令提示符。此命令提示符在 zsh 中与在 bash/sh 中看起来不同。 (5认同)
  • @bigtunacan,`printf` **是 POSIX 指定的**,比 `echo` 详细得多。也就是说,许多不同的“echo”行为可以称自己是 POSIX 兼容的,但是**每个** POSIX 兼容的 UNIX 都会有一个“printf”命令,其行为方式与所包含的完全相同(对于所有标准定义的运算符) )。 (3认同)
  • @bigtunacan 然后您可以安装它或参考其他答案。他说“你可以用 printf 代替”并说明它的优点。 (2认同)
  • 如果“ hello world”是用户提供的字符串,则这很危险;可以对`printf`进行利用。因此,请始终使用固定的格式字符串,例如`printf%“ s \ n” hello world` (2认同)

cho*_*oba 1589

你确定你在bash吗?这三种方式对我有用:

echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
Run Code Online (Sandbox Code Playgroud)

  • -e flag为我做了,"能够解释反斜杠逃逸" (334认同)
  • 正如各种其他-e所提到的,并不适用于所有发行版和版本.在某些情况下,它会被忽略,而在其他情况下,它实际上会被打印出来.我不相信这为OP修好了所以不应该接受答案 (19认同)
  • 我认为所有*nix OS上都不存在```-e``` param (18认同)
  • @kenorb:它存在于bash中.这是一个内置的. (10认同)
  • 为什么第三个有效?没有 $ 它返回“Hello n world” (2认同)
  • @Christian:在其他 shell 中,内置的“echo”不必支持“-e”标志。这就是我问的原因。 (2认同)

Van*_*uan 551

echo $'hello\nworld'
Run Code Online (Sandbox Code Playgroud)

版画

hello
world
Run Code Online (Sandbox Code Playgroud)

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

表格的字是特别对待的.单词扩展为字符串,替换为ANSI C标准指定的反斜杠转义字符.$'string'

  • @EvgeniSergeev不确定你的意思,但它首先对我不起作用.那是因为我使用的是双引号,结果证明这只适用于单引号!在Mac上的终端尝试. (14认同)
  • 字符串中的变量问题未被扩展. (11认同)
  • 这对任何人都行不通吗?让我们知道 (3认同)

Nay*_*Zen 129

你可以随时做echo "".

例如

echo "Hello"
echo ""
echo "World"
Run Code Online (Sandbox Code Playgroud)

  • `echo`足以获得一个空行 (65认同)
  • `echo""`对我有用,我认为这是打印新行的最简单形式,即使这不能直接回答这个问题.干杯. (6认同)
  • @Okneloper对我来说很好. (5认同)
  • 我认为它不及`echo -en“ \ n”`一样明显(因此可能更加混乱)。 (2认同)

Har*_*ani 46

尝试

echo -e "hello\nworld"
hello
world
Run Code Online (Sandbox Code Playgroud)

纳米编辑为我工作.


Unc*_*roh 40

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

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

echo $(GET_RECORDS);
Run Code Online (Sandbox Code Playgroud)

如上所述,该方法的实际运行本身可以包裹在回声中,该回声取代可能在该方法本身中的任何回声.显然我为了简洁而淡化了它,发现它并不容易!

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

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

GET_RECORDS;
Run Code Online (Sandbox Code Playgroud)


小智 37

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

echo -e 'Hello,\nWorld!'
Run Code Online (Sandbox Code Playgroud)

结果是:

Hello,
World!
Run Code Online (Sandbox Code Playgroud)

  • 在“RHEL 9.7”中使用双引号进行测试并且工作正常。 (2认同)

Sat*_*esh 23

这对我来说是不可思议的,

__CODE__

  • 单个反斜杠就足够了 (3认同)
  • 也适用于Windows 7上的GitBash ;-) (2认同)
  • 减一表示重复已经存在的答案。 (2认同)

Cir*_*四事件 21

POSIX 7回音

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

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

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

除非您有可选的XSI扩展名.

所以printf改用:

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

文件格式符号:

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

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

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

这可能会导致一些混乱.


ali*_*oar 16

str='hello\nworld'
$ echo | sed "i$str"
hello
world
Run Code Online (Sandbox Code Playgroud)

  • 为什么要费心调用第二个程序呢?这并不是说我们试图在 bash 中编写实时应用程序;)但这不是必需的。 (2认同)

van*_*hou 9

它适用于CentOS:

echo -e ""hello\nworld""
Run Code Online (Sandbox Code Playgroud)


Ani*_*ish 9

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

echo
Run Code Online (Sandbox Code Playgroud)

或者

echo -e '\n'
Run Code Online (Sandbox Code Playgroud)


R S*_*Sun 7

只需输入

echo
Run Code Online (Sandbox Code Playgroud)

换行

  • 被严重低估的答案,不敢相信这个问题自 2011 年以来已经积累了 20 多个答案,而且没有一个包含这个简单的解决方案。 (5认同)
  • @AhiTuna 要清屏,只需输入“clear”命令 (4认同)
  • 别名 c='echo ; 回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;回声;' 这是我清除屏幕的唯一方法,谢谢! (3认同)
  • 在清屏方面,Ctrl+L 也可以在大多数终端上清屏。 (2认同)

Dhw*_*nit 6

这可以更好地完成

x="\n"
echo -ne $x
Run Code Online (Sandbox Code Playgroud)

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

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


vin*_*zee 6

您也可以:

echo "hello
world"
Run Code Online (Sandbox Code Playgroud)

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

这适用于我的macOS和Ubuntu 18.04


ski*_*ety 6

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

newline='
'

echo "first line${newline}second line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
Run Code Online (Sandbox Code Playgroud)


小智 6

我只使用 echo 不带任何参数:

echo "Hello"
echo
echo "World"
Run Code Online (Sandbox Code Playgroud)

  • 这是错误的,因为“Hello”后面是两个换行符,而不是一个。 (3认同)

DNT*_*DNT 5

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

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

r=$(foo "my message");
echo -e $r;
Run Code Online (Sandbox Code Playgroud)

只有这个技巧在我正在使用这个 Bash 版本的 Linux 系统上有效:

GNU bash, version 2.2.25(1)-release (x86_64-redhat-linux-gnu)
Run Code Online (Sandbox Code Playgroud)


Tan*_*DLJ 5

我的脚本:

echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings
Run Code Online (Sandbox Code Playgroud)

输出:

echo "WARNINGS: $warningsFound WARNINGS FOUND:\n$warningStrings
Run Code Online (Sandbox Code Playgroud)

在我的 Bash 脚本中,我和你一样生气,直到我刚刚尝试过:

echo "WARNING : $warningsFound WARNINGS FOUND:
$warningStrings"
Run Code Online (Sandbox Code Playgroud)

只需点击Enter您要插入该跳转的位置即可。现在的输出是:

WARNING : 2 WARNINGS FOUND:\nWarning, found the following local orphaned signature file:
Run Code Online (Sandbox Code Playgroud)

  • 请注意,您可能希望在变量名周围使用 ${ } ,因为当 shell 找到名为 $warningsFound 的变量并打印该变量而不是两个单独的输出时,不这样做会导致非常奇怪的行为。 (6认同)
  • 我错过了一个字。如果您有一个名为 $warnings 的变量,在某些情况下不使用 ${warningsFound},您可能最终会得到 $warnings + "Found" 的内容而不是您想要的变量。 (3认同)

Pes*_*The 5

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

${parameter@operator} - E operator

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

$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
Run Code Online (Sandbox Code Playgroud)