echo
echoSingle Unix Specificationに厳密に準拠する実装では、次の場合に改行が追加されます。
echo 'line1\nline2'
しかし、それは信頼できる動作ではありません。実際、期待できる標準的な動作はありませんecho。
オペランド
string
標準出力に書き込まれる文字列。最初のオペランドがの-n場合、またはいずれかのオペランドに< \バックスラッシュ>文字が含まれている場合、結果は実装定義です。
上XSI準拠の最初のオペランドがある場合のシステム、-nそれは文字列として扱われるものではないオプション。次の文字シーケンスは、任意の引数内のXSI準拠システムで認識されます。
\a- <アラート>を記述します。
\b- <backspace>を記述します。
\c- 出力の最後の引数の後に続く<newline>を抑制します。\c引数に続くすべての文字は無視されます。
\f- <form-feed>を記述します。
\n- <newline>を記述します。
\r- <carriage-return>を記述します。
\t- <tab>を記述します。
\v- <vertical-tab>を記述します。
\\- <バックスラッシュ>文字を記述します。
\0num-ゼロ、1、2、または3桁の8進数である8ビット値を書き込みnumます。
したがってecho、を使用して改行を記述する方法を知る一般的な方法は実際にはありませんecho。
bashシェルは通常んではない仕様に準拠し、ハンドル-nやその他のオプションを、それでも不確実であること。できるよ:
shopt -s xpg_echo
echo hey\\nthere
hey
there
そして、もないという場合には必要であるbashビルド時のオプションで構築されています...
--enable-xpg-echo-default
オプションechoを必要とせずに、ビルトインがデフォルトでバックスラッシュでエスケープされた文字を展開するようにし-eます。これにより、xpg_echoシェルオプションのデフォルト値がに設定され、onBash echoがSingle Unix Specificationバージョン3で指定されたバージョンのように動作するようになります。認識されるエスケープシーケンスの説明については、Bash Builtinsを参照してくださいecho。
printf
一方、printfの動作は比較してかなり飼いならされています。
根拠
このprintfユーティリティは、以前から提供されていた機能を提供するために追加されましたecho。ただし、既存のさまざまなバージョンには互換性のない違いがあるためecho、このバージョンには特別な機能がほとんどなくprintf、第9版システムの1つに基づいたこの新しいユーティリティにそれらを残しています。
EXTENDED DESCRIPTIONセクションprintf()は、ISO C標準の機能とほぼ完全に一致しますが、XBD File Format Notationのファイル形式表記法で説明されています。
引数を記述するフォーマット文字列を処理します-これは任意の数になりますが、文字列の場合はほとんど%byte文字列かリテラル文字列%sです。%f最初の引数のオーマット以外は%b、\cエスケープを処理しないことを除いて、yte文字列引数とほとんど同じように動作します。
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
echo必須?を使用できますprintf。