bash の二重引用符内のバックスラッシュと改行を理解できません

bash の二重引用符内のバックスラッシュと改行を理解できません

によるとGNUドキュメント

バックスラッシュは、'$'、'`'、'"'、'\'、または改行のいずれかの文字が後に続く場合にのみ、その特別な意味を保持します。二重引用符内では、これらのいずれかの文字が後に続くバックスラッシュは削除されます。

私は試した

p="a\$b";echo $p  # a$b
p="a\`b";echo $p  # a`b
p="a\"b";echo $p  # a"b
p="a\\b";echo $p  # a\b

すべて正常です。しかし、改行は?

p="a\newlineb";echo $p  # a\newlineb

ドキュメント内の改行はどういう意味ですか?

答え1

Newline は改行文字の名前です。つまり、\nC では通常次のように記述される文字です。

$ p="a\
b"; echo "$p"
ab

その結果はab\a<newline>bPOSIX標準では:

引用符で囲まれていないは<backslash>、 を除いて、次の文字のリテラル値を保持します<newline>。 が<newline>の後に続く場合<backslash>、シェルはこれを行継続として解釈します。 は<backslash><newline>入力をトークンに分割する前に削除されます。 エスケープされた は<newline>入力から完全に削除され、空白に置き換えられないため、トークン区切り文字として使用することはできません。

しかし、文字列二重引用符で囲まれています...これは特殊なケースです:

は、 特殊文字とみなされる次の文字のいずれかが続く場合にのみ、 <backslash>エスケープ文字としての特殊な意味を保持します: $、、、、 。 `"\<newline>

つまり、二重引用符で囲まれた文字列は、バックスラッシュと改行が次のように解釈されることを意味します。ない引用符はまったく使用されず、行継続として機能し、バックスラッシュと改行の両方が削除されます。

pこれは、変数を実行するときではなく、変数に割り当てるときに発生することに注意してくださいecho

参照bash/POSIX シェルで変数を引用符で囲み忘れた場合のセキュリティへの影響変数を常に引用符で囲む必要があることについて。

関連情報