バックスラッシュはによって特別に扱われますがecho -e
、最初にシェルの引用規則に従って、シェル(この場合は)によって特別に扱われることがあります。bash
echo
実際に見る引数はですHello\\n
。にパスした-e
ためecho
、バックスラッシュエスケープを特別に処理\\
し、単一のに折りたたまれ\
ます。ファイナルn
はエスケープされないため、文字通り表示されます。
この理由はecho
、シェルがそれ自体の操作の前に、それとは別に、シェルが\
特定のコンテキストで特別に処理し、他のコンテキストでは処理しないためです。引用符で囲まれていない\
文字は常に特別に扱われ、単一引用符で囲まれたが \
、特別に扱われることはありませんが、治療の二重引用符で囲まれた \
文字は、あなたが走ったコマンドのように、より微妙かつ複雑です。
シェルは、コマンド内で二重引用符で囲まれたテキストを検出すると"Hello\\\n"
、それ\
自体が二重引用符内で特別な意味を持つことができる文字の前にある場合、エスケープ文字として扱います。
\
内部""
には特別な意味があることがあるため、\
別の直前にあるa は\
その秒を引用する効果があり\
ます。したがって、二重引用符内では、最初の引用符\\
はにまとめられ\
ます。
- 最初の2
\
文字の後に、最初の2 文字の\
影響を受けず、に先行する3番目の文字がありn
ます。しかしn
、二重引用符内で特別に扱われる文字ではないため、\
この状況ではそれ以前は特別に扱われません。したがって、\n
残ります\n
。
その効果は、二重引用符で\\\n
囲まれ\\n
たものとして解釈されることです。
をecho -e
見る\\n
と、最初のもの\
は2番目のものから特別な意味を取り除いているので、そのテキストに対して文字通りecho
印刷\n
します。
Hello
バックスラッシュを使用せずに余分な改行で印刷することが目標である場合(質問はもともとこれについてあいまいでしたが、有用な例だと思います)、1つの解決策はを削除すること\
です。最後に余分な改行を使用してecho -e "Hello\\n"
出力Hello
を実行します。
より良い解決策は、単一引用符を使用してを書くことecho -e 'Hello\n'
です。単一引用符は、引用の最も強力な形式です。さらに良い解決策は通常、printf
代わりに使用echo
することprintf 'Hello\n\n'
です。
Hello\
バックスラッシュを含めて印刷し、その後に改行を追加することが目的の場合、二重引用符で囲む方法は可能ですが、面倒です。後方、仕事をそれを把握するには、次のecho -e
変換\\
へ\
と\n
改行すると、二重引用符変換を\\
し\
、あなたが6つのバックスラッシュ(でそれを行うことができますのでecho -e "Hello\\\\\\n"
)、ので\\n
ターンに\n
別のエスケープ1つのバックスラッシュによるもの。がエスケープされていない\n
場合でも二重引用符が保持されるため、5でもでき\
ます。
これは、echo -e
一重引用符の利点を示していますecho -e 'Hello\\\n'
。一重引用符()の中に見たいものを入れてください。printf
ここでも良いです 1つのオプションはprintf 'Hello\\\n\n'
です。しかし、printf
本当に輝くのは、追加の引数をプラグインできることです。を使用してprintf '%s\n\n' 'Hello\'
、のHello\
代わりに2番目の引数を挿入できます(文字通り、単一引用符は何も変更しないため)%s
。