我发现它可以从命令行获取用户输入。但它无法识别我输入的新行字符。正在做:
#!/bin/bash
read -e -p "Multiline input=" variable;
printf "'variable=%s'" "${variable}";
- 键入会输出
'multi\nline'
Multiline input=
printf
'variable=multinline'
- 键入会输出
'multi\\nline'
Multiline input=
printf
'variable=multi\nline'
如何printf
打印我读到的新行read -p
,即输出
multi line
而不是multinline
或multi\nline
?
相关问题:
答案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
我没有使用bash
or的某些功能,而是用实际的新行替换转义的换行符:printf
sed
\\n
#!/bin/bash
read -e -p -r "Multiline input=" variable;
printf "'variable=%s'" "${variable}";
variable=$(printf "${variable}" | sed 's/\\n/\n/g');
参考: