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

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

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

#!/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'

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

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

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

答え2

@muruは正しいbashの答えを持っています。

別のオプション:バックスラッシュシーケンスを処理しますが、入力文字printfに注意する必要があります。%

read -r input
printf "${input//%/%%}\n"

答え3

orの機能の一部を使用する代わりに、bashエスケープされた改行文字を実際の改行文字に置き換えました。printfsed\\n

#!/bin/bash
read -e -p -r "Multiline input=" variable;
printf "'variable=%s'" "${variable}";
variable=$(printf "${variable}" | sed 's/\\n/\n/g');

引用:

  1. https://stackoverflow.com/questions/52065016/how-to-replace-n-string-with-a-new-line-in-unix-bash-script
  2. https://stackoverflow.com/questions/1251999/how-can-i-replace-a-newline-n-using-sed
  3. https://stackoverflow.com/questions/10748453/replace-comma-with-newline-in-sed-on-macos
  4. sedは改行文字を置き換えることができますか?

関連情報