echo -e
またecho $'...'
、次のエスケープシーケンスをサポートしているという点で両方とも類似しています。
\a alert (bell)
\b backspace
\e
\E an escape character
\f form feed
\n new line
\r carriage return
\t horizontal tab
\v vertical tab
\\ backslash
\0nnn the eight-bit character whose value is the octal value nnn (zero to three octal digits)
\xHH the eight-bit character whose value is the hexadecimal value HH (one or two hex digits)
\uHHHH the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHH (one to four hex digits)
\UHHHHHHHH
the Unicode (ISO/IEC 10646) character whose value is the hexadecimal value HHHHHHHH (one to eight hex digits)
それらには違いがあります。上記に加えて、以下をecho -e
サポートします。
\c suppress further output
\0nnn the eight-bit character whose value is the octal value nnn (zero to three octal digits)
対照的に、以下を$'....'
サポートします:
\' single quote
\" double quote
\nnn the eight-bit character whose value is the octal value nnn (one to three digits)
\cx a control-x character
2つの間で、\c
拡張機能に互換性がないことに注意してください。
$ echo -e 'start\n\cIstop'
start
$ echo $'start\n\cIstop'
start
stop
以下のためにecho -e
上記、\c
それによって無視、さらに出力を抑制することができますIstop
。対照的に、の場合$'...'
、\cI
タブとして解釈されます。
視覚的に類似した形式: $"..."
とは対照的に$'...'
、の機能$"..."
はまったく異なります。含まれている文字列は、現在のロケールに従って翻訳されます。
echo -e
論争
echo -e
シェルによって普遍的にサポートされているわけではなく、多くの人がこの-e
オプションを設計ミスと見なしています。観察する:
$ ls
-e -n
$ echo *
$ printf "%s\n" *
-e
-n
ご覧のように、印刷対象がecho
ダッシュで始まる場合、結果は予期しないものになる可能性があります。印刷する最初の文字列がecho
ダッシュで始まらないことが確実でない限り、を使用することをお勧めしますprintf
。
これらの理由により、POSIX標準は次のように結論付けています。
新しいアプリケーションでは、エコーの代わりにprintfを使用することをお勧めします。
bash
過去22年間維持してきたChet Rameyは、次のことに同意します。
[N] ewコードはprintfを使用する必要があります。
Hello\nWorld
。-e
エスケープ文字を解釈するにはスイッチが必要です。