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エスケープ文字を解釈するにはスイッチが必要です。