echo -e“ <string>”とecho $“ <string>”の違い


20

使用の違いは何ですか

echo -e "Hello\nWorld" 

そして

echo $"Hello\nWorld" 

両方とも出力しないでください:

Hello
World

1
やってみた?2番目の出力Hello\nWorld-eエスケープ文字を解釈するにはスイッチが必要です。
becko 14年

4
2番目の場合、echo $'Hello\nWorld'bashの下の2行に出力される単一引用符で記述したのではないかと思われます。
John1024 14年

@becko、はい、私はそれを試してみましたが、どちらもまったく同じものを出力しました。
マーク14年

回答:


33

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を使用する必要があります。


1
両方のことは注目に値する。またチェットPOSIXが使用することをお勧めprintfするのではなくecho
geirha

@geirha非常に良い点。回答が更新されました。
John1024 14年

1
グロブからの予期しないオプションの問題(など*)は、実際には固有ではありませんecho。これは、(従来の方法で記述された)短いまたは長いオプションを認識し、などのlsファイル名オペランドをとるコマンドで発生します。echo(ソースが言及しているように)echo通常--、オプションの終わりを示すことを受け入れないため、状況は少し悪くなりますが、のようなコマンドを書くことはできますls -- *l。(そして実際には、特にスクリプトで*または-で始まるグロブを使用する場合、通常はそのようにコマンドを記述する必要があります。)
エリアアカガン14

徹底的な答えをありがとう、私はもちろん、私のオペレーティングシステムのために運動しを持っていると私は使用していくつかのテキストをプリントアウトするために必要な\n、私が使用している場合ので、実際にはそれは問題ではない、エスケープシーケンスをecho -e '...'echo $'...'またはecho $"..."
マーク・
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.