二重引用符で囲まれた $'\n' は機能しません。

二重引用符で囲まれた $'\n' は機能しません。

改行文字を含む文字列を次のようにプログラムにコマンドライン引数として送信したいと思います。

myprogram Hello$'\n'World

ただし、文字列に二重引用符を使用すると、次のようになります。

myprogram "Hello$'\n'World Hello Again"

その後、受信した文字列には改行文字の代わりにmyprogramその文字列が含まれます。$'\n'

答え1

この構文を引用しても$'…'効果はありません。使用:

$ myprogram "Hello"$'\n'"World Hello Again"

または

$ myprogram Hello$'\n'World\ Hello\ Again

または

$ a=$'\n'
$ myprogram "Hello${a}World Hello Again"

または

$ myprogram "$(echo -e 'Hello\nWorld Hello Again')"

または

$ myprogram "Hello
World Hello Again"

答え2

文字列を包括的な引用符ペアで囲む必要はありません。個別に引用された文字列を単一の単語に連結できます。

myprogram Hello$'\n'"World Hello Again"

引用符は文字列を定義せず、その間に現れるすべての文字をエスケープします。

答え3

交互に、

myprogram "$(printf '%s\n' "Hello" "world once" "World Hello Again")"

printf コマンドは、書式文字列を再利用して与えられた引数を使用します。また、$()文法は末尾の改行を自動的に削除します。

答え4

興味深いことに、3つの答えのどれも最も簡単な解決策を指摘していませんでした。

myprogram $'Hello\nWorld Hello Again'

ドル相場以降(言えば)引用の一形態、完全引数に使用します。

もちろん、bashでは、引用符はどのような区切り文字でもないことを知っておくことをお勧めします。 空のスペース単語の分割に使用されます。引用符は、あるパラメータの終点と他のパラメータの始点とを区別しません。これは、単一のパラメータ内で参照方法を自由に混合できることを意味します。 (この内容はすでにこのサイトの他の場所でよく説明されています。検索してリンクできるかどうかを確認します。)

関連情報