コマンドラインで改行文字を使用して入力行を読み取るには?

コマンドラインで改行文字を使用して入力行を読み取るには?

コマンドラインからユーザー入力を取得できることがわかりました。ところで、私が入力した改行文字を認識しません。行為:

#!/bin/bash
read -e -p "Multiline input=" variable;
printf "'variable=%s'" "${variable}";
  1. 入力すると'multi\nline'出力Multiline input=printf'variable=multinline'
  2. 入力すると'multi\\nline'出力Multiline input=printf'variable=multi\nline'

printf読み取った新しい行read -p、つまり出力をどのように印刷しますか?

multi line

代わりにmultinlineまたはmulti\nline

関連質問:

  1. 読み取りコマンドの-pオプションは何をしますか?
  2. bash:読み取り:「\ n」(改行)文字をキャプチャする方法は?
  3. シェル:読み取り:EOFと改行文字を区別します。
  4. https://stackoverflow.com/questions/4296108/how-do-i-add-a-line-break-for-read-command
  5. 改行で区切られたパラメータを読む
  6. https://stackoverflow.com/questions/43190306/how-to-add-new-line-after-user-input-in-shell-scripting

ベストアンサー1

入力\n(たとえば、2文字\の合計n)が許可されている場合は、次のようにprintf解釈できます。

#!/bin/bash
IFS= read -rep "Multiline input=" variable;
printf -v variable "%b" "$variable"
printf "'variable=%s'\n" "${variable}";

たとえば、

~ ./foo.sh
Multiline input=foo\nbar
'variable=foo
bar'

~からバッシュマニュアル:

バックスラッシュ文字「\」を使用すると、次の文字の読み取りと行の連続の特別な意味を削除できます。

「行連続」ビットは、行区切り文字で他の文字を使用しない限り、改行をエスケープできないことを意味するようです。

おすすめ記事