bashのprintfとechoの違い

bashのprintfとechoの違い

printfbashの関数と関数の違いは何ですかecho

具体的には、以下を実行します。

echo "blah" >/dev/udp/localhost/8125

8125を受信したサーバーに「おそらく」コマンドが送信されませんでした。

printf "blah" >/dev/udp/localhost/8125

データが送信されました。 printfは出力の終わりに追加のEOFを送信しますか?

答え1

どちらも組み込みコマンドechoです(1998年v2.0.2以降、Bashに組み込まれています)。常に状態0で終了し、単に標準出力に引数を出力し、行終端文字を表示し、フォーマット文字列を定義し、失敗した場合はゼロ以外の終了ステータスコードを提供します。printfprintfechoprintf

printf出力形式をより効果的に制御できます。プロジェクトで使用するフィールドの幅だけでなく、数値のさまざまな書式設定オプション(使用する出力基準、インデックスを印刷するか、シンボルを印刷するか、後で印刷する桁数など)を指定するために使用できます。 )。小数点)。これは、他のパラメータの印刷方法と場所を制御する形式の文字列を提供することによって行われ、C言語(%03d、、、...)と同じ構文を持ちます。これは、format()を議論しないときにパーセント記号をエスケープする必要があることを意味します。%e%+d%%

echoおそらく、デフォルトで使用される改行文字を追加すると(-nオプションを使用する場合を除く)、同じ効果が得られます。

printf "blah\n" >/dev/udp/localhost/8125

パフォーマンスに関しては、文字列を読み取ってフォーマットする必要があるecho後者よりもこれが速いと常に考えていました。printfしかし、time(組み込みの)テストでは、次のような結果が出ました。

$ time for i in {1..999999}; do echo "$i" >/dev/null; done
real    0m10.191s
user    0m4.940s
sys 0m1.710s

$ time for i in {1..999999}; do printf "$i" >/dev/null; done
real    0m9.073s
user    0m4.690s
sys 0m1.310s

デフォルトでは、次printfのように改行を追加するように指示します。echo

$ time for i in {1..999999}; do printf "$i\n" >/dev/null; done
real    0m8.940s
user    0m4.230s
sys 0m1.460s

これは印刷しないよりもはるかに遅いですが、\n印刷するよりも高速ですecho

答え2

違いは、出力のecho末尾に改行文字を送信することです。 EOFを「送信する」方法はありません。

答え3

これはおそらくechoとprintfの最良の説明です。

http://www.in-ulm.de/~mascheck/various/echo+printf/

非常に高いレベルで.. printfはechoに似ていますが、より多くの書式を設定できます。

答え4

文字列「-e」を文字通り印刷するには、echoを使用するのが困難です。最近スクリプトの作成中にこの問題が発生しました。

リテラル文字列 "-e"を印刷するには、prinfを使用する必要があります。

関連情報