如何将 STDIN 中的多行读取到变量中?

Rob*_*t K 32 scripting bash

我一直在谷歌上搜索这个问题无济于事。我正在工作中自动化构建过程,我要做的就是获取版本号和可能是多行的构建的微小描述。它运行的系统是 OSX 10.6.8。

我已经看到了从使用 CAT 到根据需要处理每一行的所有内容。我不知道我应该使用什么以及为什么。

尝试

read -d '' versionNotes
Run Code Online (Sandbox Code Playgroud)

如果用户必须使用退格键,则会导致输入乱码。也没有终止输入的好方法,因为 ^D 不会终止,而 ^C 只是退出进程。

read -d 'END' versionNotes
Run Code Online (Sandbox Code Playgroud)

有效...但如果需要退格键,输入仍然会出现乱码。

while read versionNotes
do
  echo "  $versionNotes" >> "source/application.yml"
done
Run Code Online (Sandbox Code Playgroud)

没有正确结束输入(因为我来不及查找空字符串的匹配项)。

poi*_*ige 28

man bash 提到«…

命令替换 $(cat file) 可以替换为等效但速度更快的 $(< file)。

……»

$ myVar=$(</dev/stdin)
hello
this is test
$ echo $myVar
hello this is test
$ echo "$myVar"
hello
this is test
Run Code Online (Sandbox Code Playgroud)

我同意这是值得一提的 -echo "$myVar"会按照给出的方式显示输入。

  • UNIX® 终端确实有“纪律”:https://en.wikipedia.org/wiki/Line_discipline • 查看“eof”是什么意思 • 请阅读`man stty`,了解如何获取当前设置 (2认同)
  • ctrl-d 停止。 (2认同)

voi*_*ces 15

尝试这个:

user@host:~$ read -d '' x <<EOF
> mic
> check
> one
> two
> EOF
Run Code Online (Sandbox Code Playgroud)

没有换行符:

user@host:~$ echo $x
mic check one two
Run Code Online (Sandbox Code Playgroud)

换行符:

user@host:~$ echo "$x"
mic
check
one
two
Run Code Online (Sandbox Code Playgroud)

  • `-d ''` 正是我所需要的。谢谢 (2认同)

ada*_*ptr 9

请参阅优秀的Bash 指南以了解您的所有 bash 脚本需求。

特别是 Bash 常见问题解答在编号 1 处包含此内容:

如何逐行(和/或逐字段)读取文件(数据流、变量)?


Ber*_*ITS 0

你有几种方法。

最简单的方法之一是:

MYVAR=$(yourcommand)
echo $"MYVAR"
Run Code Online (Sandbox Code Playgroud)

例如:

MYVAR=$(ls /)
echo $"MYVAR"
Run Code Online (Sandbox Code Playgroud)