在Bash中,尝试了以下操作:
echo -e "hello\nworld"
但是它不打印换行符,仅打印\\n
。 如何使其打印换行符?
我正在使用Ubuntu 11.04。
您可以改用printf
:
printf "hello\nworld\n"
printf
具有比echo
更一致的行为。 echo
的行为在不同版本之间差异很大。
你确定你在狂欢吗? 为我工作,所有三种方式:
echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo $'hello\nworld'
版画
hello
world
$''
字符串使用ANSI C引用 :
' are treated specially.
$' '
形式的单词会被特殊对待。 , with backslash-escaped characters replaced as specified by the ANSI C standard. 该单词扩展为 ,并按ANSI C标准的规定替换了反斜杠转义的字符。
您总是可以echo ""
。
例如
echo "Hello"
echo ""
echo "World"
尝试
echo -e "hello\nworld"
hello
world
在nano编辑器中为我工作。
从手册页:
-e
启用反斜杠转义的解释
如果有人偶然发现自己在墙上撞头试图弄清楚为什么同事的脚本不会打印换行符,请注意->
#!/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;
这在Raspbian中对我有效,
echo -e "hello\\nworld"
POSIX 7回显
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
未定义,反斜杠是实现定义:
如果第一个操作数是-n,或者任何操作数包含<backslash>字符,则结果是实现定义的。
除非您具有可选的XSI扩展名。
因此,我建议您改用printf
,它已被明确指定:
格式操作数应用作XBD文件格式符号[...]中描述的格式字符串
文件格式符号 :
\\ n <newline>将打印位置移至下一行的开头。
还请记住,Ubuntu 15.10和大多数发行版都将echo
都实现为:
help echo
which echo
可能会导致一些混乱。
str='hello\nworld'
$ echo | sed "i$str"
hello
world
它在CentOS中对我有用:
echo -e ""hello\nworld""
只需输入
echo
换行
您也可以:
echo "hello
world"
这既可以在脚本内运行,也可以从命令行运行。
在命令行中,按Shift + Enter键可在字符串内进行换行。
这适用于我的macOS和Ubuntu 18.04
对于那些无法与任何这些解决方案配合使用并且需要从其函数中获取返回值的用户,这里还有一个条目:
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 "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:
最好这样做
x="\n"
echo -ne $x
-e选项将解释转义符的转义序列
-n选项将删除输出中的尾随换行符
PS:命令回声的效果是始终在输出中包含尾随换行符,因此需要-n来关闭该功能(并减少混乱)
您还可以将回声与大括号一起使用,
$ (echo hello; echo world)
hello
world
bash 4.4
中添加了一个新的 参数扩展 ,用于解释转义序列:
${parameter@operator} - E operator
扩展名是一个字符串,它是反斜杠转义序列的参数值,其扩展程度与
$'…'
引用机制相同。
$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
如果您正在编写脚本,并且会多次将换行符作为其他消息的一部分回显,那么一个很好的跨平台解决方案是将文字换行符放入变量中,如下所示:
newline='
'
echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
有时您可以传递多个由空格分隔的字符串,它将被解释为\\n
。
例如,当使用shell脚本进行多行通知时:
#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
在bash配置文件(MacOx,iTerm)中用作别名时,我必须用双引号将文本引起来。
alias helloworld="echo -e \"hello \n world\""
附加解决方案:
在某些情况下,您必须回显长内容的多行(例如代码/配置)
例如 :
echo -e
, printf
可能有一些限制
您可以使用一些特殊的char作为占位符作为换行符(例如~
),并在使用tr
创建文件后将其替换。
echo ${content} | tr '~' '\n' > $targetFile
它需要调用另一个应该是IMO的程序( tr
)。