Stdout

使用 echo 時如何添加新行

  • February 19, 2021

為什麼以下命令沒有在生成的文件中插入新行,解決方案是什麼?

$ 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

--enable-xpg-echo-default

> > 預設情況下使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中的文件格式表示法進行描述的。 > > >

它處理描述其參數的格式字元串——可以是任意數量的東西,但對於字元串來說,幾乎可以是%byte 字元串或文字%s字元串。除了%f第一個參數中的格式之外,它的行為最像一個%byte 字元串參數,只是它不處理\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" &gt;&gt; readme.txt

引用自:https://unix.stackexchange.com/questions/219268