使用 echo 時如何添加新行
為什麼以下命令沒有在生成的文件中插入新行,解決方案是什麼?
$ echo "Line 1\r\nLine2" >> readme.txt $ cat readme.txt Line 1\r\nLine2
echo
如果您這樣做,則嚴格符合 Single Unix Specification的
echo
實現將添加換行符:echo 'line1\nline2'
但這不是一個可靠的行為。事實上,確實沒有任何您可以期待的標準行為
echo
。> >
string
> > > > > > > 要寫入標準輸出的字元串。如果第一個操作數是-n
,或者任何操作數包含*<\
反斜杠>字元,則結果是實現定義的*。 > > > > > > 在符合 XSI 的系統上,如果第一個操作數是-n
,則應將其視為字元串,而不是選項。以下字元序列應在任何參數內的符合 XSI 的系統上辨識: > > > > > > > > > > > >\a
- 寫一個*<alert>。 > > > > > > > > >\b
- 寫一個<退格鍵>。 > > > > > > > > >\c
- 抑制輸出中最後一個參數後面的<newline>。參數中的所有字元\c
都應被忽略。 > > > > > > > > >\f
- 寫一個<form-feed>。 > > > > > > > > >\n
- 寫一個<newline>。 > > > > > > > > >\r
- 寫一個<輸入>。 > > > > > > > > >\t
- 寫一個<tab>。 > > > > > > > > >\v
- 寫一個<vertical-tab>。 > > > > > > > > >\\
- 寫一個<反斜杠>字元。 > > > > > > > > >\0num
- 寫一個 8 位值,它是零、一、二或三位數的八進制數num
*。 > > > > > > > > > > > > > > > > > >因此,實際上沒有任何通用的方法可以知道如何使用 編寫換行符
echo
,除非您通常可以依靠這樣echo
做。
bash
外殼通常不符合規範,並處理-n
和其他選項,但即使這樣也不確定。你可以做:shopt -s xpg_echo echo hey\\nthere
hey there
如果已使用建構時選項建構,則甚至沒有必要……
bash
> > 預設情況下使
echo
內置展開反斜杠轉義字元,而不需要該-e
選項。xpg_echo
這會將shell 選項的預設值設置為on
,這使得 Bash 的echo
行為更像是在 Single Unix Specification 版本 3 中指定的版本。有關辨識的轉義序列的描述,請參見Bash Builtinsecho
。 > > >
printf
另一方面,
printf
相比之下,他的行為相當溫和。> > 添加該
printf
實用程序是為了提供歷史上由echo
. 但是,由於現存的各個版本之間存在不可調和的差異echo
,該版本幾乎沒有特殊功能,將這些功能留給了這個printf
基於第九版系統的新實用程序。 > > > EXTENDED DESCRIPTION 部分幾乎與printf()
ISO C 標準中的函式完全匹配,儘管它是根據XBD File Format Notation中的文件格式表示法進行描述的。 > > >它處理描述其參數的格式字元串——可以是任意數量的東西,但對於字元串來說,幾乎可以是
%b
yte 字元串或文字%s
字元串。除了%f
第一個參數中的格式之外,它的行為最像一個%b
yte 字元串參數,只是它不處理\c
轉義。printf ^%b%s$ '\n' '\n' '\t' '\t'
^ \n$^ \t$
請參閱為什麼
printf
優於echo
?更多。
echo() printf
您可以編寫符合自己的標準
echo
,例如…echo(){ printf '%b ' "$@\n\c" }
…這幾乎應該總是自動做正確的事情。
實際上,不……
\n
如果最後一個參數以奇數個*<backslashes>*結尾,則會在參數的尾部列印一個文字。但這不會:
echo() case ${IFS- } in (\ *) printf %b\\n "$*";; (*) IFS=\ $IFS printf %b\\n "$*" IFS=${IFS#?} esac
將 -e 標誌傳遞給 echo 以使其解析轉義字元,例如“\r\n”,如下所示:
echo -e "Line 1\r\nLine2" >> readme.txt