bash prints文本中的echo换行符

Echo newline in Bash prints literal

在bash,本想:P></

1
2
echo -e"hello
world"

但它不会打印在newline,
only。如何能让它打印newline茶?P></

我使用Ubuntu 11.04。P></


你可以用printf代替:

1
2
3
printf"hello
world
"

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


你确定你在巴什吗?为我工作,三种方式:

1
2
3
4
5
6
echo -e"Hello
world"

echo -e 'Hello
world'

echo Hello$'
'
world


1
2
echo $'hello
world'

印刷品

1
2
hello
world

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

Words of the form $'string' are treated specially. The word expands to string, with backslash-escaped characters replaced as specified by the ANSI C standard.


你可以一直这样做。

例如

1
2
3
echo"Hello"
echo""
echo"World"


如果有人发现自己的头撞在墙上,试图弄明白为什么同事的脚本不会打印新行,请注意这一点->

1
2
3
4
5
6
7
8
#!/bin/bash
function GET_RECORDS()
{
   echo -e"starting
 the process"
;
}

echo $(GET_RECORDS);

如上所述,方法的实际运行本身可能被一个echo包裹,该echo取代了方法本身可能存在的任何echo。很明显,我是为了简洁而把它稀释的,这不容易被发现!

然后你可以告诉你的同志们,一个更好的执行职能的方法是这样的:

1
2
3
4
5
6
7
8
#!/bin/bash
function GET_RECORDS()
{
   echo -e"starting
 the process"
;
}

GET_RECORDS;


尝试

1
2
3
4
echo -e"hello
world"

hello
world

在Nano编辑器中为我工作。


这对我在拉斯宾很有用,

1
2
echo -e"hello\
world"


1
2
3
4
5
str='hello
world'

$ echo | sed"i$str"
hello
world


POSIX 7在回声

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

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

If the first operand is -n, or if any of the operands contain a character, the results are implementation-defined.

除非您有可选的XSI扩展。

所以用printf代替:

format operand shall be used as the format string described in XBD File Format Notation [...]

文件格式符号:

Move the printing position to the start of the next line.

还要记住,Ubuntu 15.10和大多数发行版都实现了echo,这两个版本都是:

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

这会导致一些混乱。


它在Centos为我工作:

1
2
echo -e""hello
world""

您还可以执行以下操作:

1
2
echo"hello
world"

这既适用于脚本内部,也适用于命令行。在命令行中,按shift+enter在字符串中进行换行。

这在我的MacOS和Ubuntu 18.04上都适用


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

1
2
3
4
5
6
7
8
9
10
11
12
13
function foo()
{
    local v="Dimi";
    local s="";
    .....
    s+="Some message here $v $1
"

    .....
    echo $s
}

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

在我用这个bash开发的Linux中,只有这个技巧有效:

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

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


我的剧本:

1
2
echo"WARNINGS: $warningsFound WARNINGS FOUND:
$warningStrings

输出:

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

在我的bash脚本中,我和你一样疯狂,直到我尝试:

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

只需按Enter键就可以插入该跳转。现在的输出是:

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


最好这样做

1
2
3
x="
"

echo -ne $x

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

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


你也可以用回音和大括号,

1
2
3
$ (echo hello; echo world)
hello
world


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

例如,当对多行注释使用shell脚本时:

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


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

${parameter@operator} - E operator

The expansion is a string that is the value of parameter with
backslash escape sequences expanded as with the $'…' quoting
mechanism.

1
2
3
4
5
$ foo='hello
world'

$ echo"${foo@E}"
hello
world