如何从命令行读取带有换行符的输入行?

如何从命令行读取带有换行符的输入行?

我发现它可以从命令行获取用户输入。但它无法识别我输入的新行字符。正在做:

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

而不是multinlinemulti\nline?

相关问题:

  1. 读取命令中的 -p 选项有何作用?
  2. bash:阅读:如何捕获“\n”(换行符)字符?
  3. shell: read: 区分 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(如两个字符\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'

bash 手册:

反斜杠字符“\”可用于删除读取的下一个字符和行继续的任何特殊含义。

“行继续”位似乎意味着您无法转义换行符,除非您使用不同的字符作为行分隔符。

答案2

@muru 有正确的 bash 答案。

另一种选择:让printf处理反斜杠序列,但您必须小心%输入中的字符

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

答案3

我没有使用bashor的某些功能,而是用实际的新行替换转义的换行符: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 可以替换新行字符吗?

相关内容