![](/img/trans.png)
[英]echo prints “\n” differently between /bin/sh and /bin/bash
[英]Echo newline in Bash prints literal \n
如何打印换行符? 这只是打印\n
:
$ echo -e "Hello,\nWorld!"
Hello,\nWorld!
你可以使用printf
代替:
printf "hello\nworld\n"
printf
比echo
具有更一致的行为。 echo
的行为在不同版本之间差异很大。
确保你在 Bash 中。 所有这四种方式都对我有用:
echo -e "Hello\nworld"
echo -e 'Hello\nworld'
echo Hello$'\n'world
echo Hello ; echo 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!"
如果有人发现自己用头撞墙试图弄清楚为什么同事的脚本不会打印换行符,请注意以下几点:
#!/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;
只需输入
echo
换一条新线
这在Raspbian 中对我有用,
echo -e "hello\\nworld"
POSIX 7 回声
http://pubs.opengroup.org/onlinepubs/9699919799/utilities/echo.html
-e
未定义,反斜杠是实现定义的:
如果第一个操作数是 -n,或者如果任何操作数包含 <反斜杠> 字符,则结果是实现定义的。
除非您有可选的 XSI 扩展。
所以我建议你应该使用printf
代替,它是明确指定的:
格式操作数应用作 XBD 文件格式表示法中描述的格式字符串 [...]
\\n <newline> 将打印位置移动到下一行的开头。
还要记住,Ubuntu 15.10 和大多数发行版都将echo
实现为:
help echo
which echo
这可能会导致一些混乱。
str='hello\nworld'
$ echo | sed "i$str"
hello
world
仅针对所问的问题(不是特殊字符等)仅将双引号更改为单引号。
echo -e 'Hello,\nWorld!'
结果是:
Hello,
World!
你也可以这样做:
echo "hello
world"
这在脚本中和命令行中都有效。
在命令行上,按Shift + Enter在字符串内进行换行。
这适用于我的 macOS 和我的Ubuntu 18.04 (Bionic Beaver) 系统。
它在 CentOS 中对我有用:
echo -e ""hello\nworld""
我只使用 echo 不带任何参数:
echo "Hello"
echo
echo "World"
我的脚本:
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:
Bash 4.4 中添加了一个新的参数扩展来解释转义序列:
${parameter@operator} - E operator
扩展是一个字符串,它是带有反斜杠转义序列的参数值,就像
$'…'
引用机制一样扩展。
$ foo='hello\nworld'
$ echo "${foo@E}"
hello
world
对于那些没有使其适用于任何这些解决方案并且需要从其函数中获取返回值的人,这里还有一个条目:
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)
这可以更好地做为
x="\n"
echo -ne $x
-e 选项将解释转义序列的反斜杠
-n 选项将删除输出中的尾随换行符
PS:命令 echo 具有始终在输出中包含尾随换行符的效果,因此需要 -n 关闭该内容(并使其不那么混乱)
如果您正在编写脚本并且将多次将换行符作为其他消息的一部分回显,一个不错的跨平台解决方案是将文字换行符放入变量中,如下所示:
newline='
'
echo "first line$newlinesecond line"
echo "Error: example error message n${newline}${usage}" >&2 #requires usage to be defined
您也可以使用带大括号的 echo,
$ (echo hello; echo world)
hello
world
这可能不适用于您的情况,但过去让我感到困惑的是:
在 Bash 中编写"hello\\nworld"
会为您提供一个带有换行符的字符串,并且echo -e
打印出该字符串。
写$'hello\\nworld'
或
"hello
world"
为您提供一个带有换行符的字符串,而普通的echo
打印出该字符串。 这很好,因为正如您所见,并不总是支持echo -e
。
有时您可以传递由空格分隔的多个字符串,它将被解释为\\n
。
例如,当使用 shell 脚本进行多行通知时:
#!/bin/bash
notify-send 'notification success' 'another line' 'time now '`date +"%s"`
在bash配置文件(MacOx,iTerm)中用作别名时,我必须用双引号将文本引起来。
alias helloworld="echo -e \"hello \n world\""
这让我在那里......
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]
反斜杠
\\<\/code>是 bash 中的特殊字符。
要打印像
'".,<\/code>这样
'".,<\/code>字符
'".,<\/code>我们需要在它们前面加上
\\<\/code> 。
因此,要使用 echo 打印新行,请使用:
echo \\n
随着jq :
$ jq -nr '"Hello,\nWorld"'
Hello,
World
附加解决方案:
在某些情况下,您必须回显多行的长内容(例如代码/配置)
例如:
echo -e
, printf
可能有一些限制
您可以使用一些特殊字符作为占位符作为换行符(例如~
)并在使用tr
创建文件后替换它:
echo ${content} | tr '~' '\n' > $targetFile
它需要调用另一个应该没问题的程序( tr
),IMO。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.