![](/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.