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

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

我一直在谷歌上搜索这个问题,但一无所获。我在工作中自动化构建过程,我所做的就是获取版本号和构建的简短描述,这些描述可能是多行的。运行该系统的系统是 OSX 10.6.8。

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

尝试

read -d '' versionNotes

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

read -d 'END' versionNotes

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

while read versionNotes
do
  echo "  $versionNotes" >> "source/application.yml"
done

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

答案1

man bash提到«…

命令替换 $(cat file) 可以被等效但更快的 $(< file) 取代。

…”

$ myVar=$(</dev/stdin)
hello
this is test
$ echo $myVar
hello this is test
$ echo "$myVar"
hello
this is test

我同意这是值得一提的——echo "$myVar"将会显示给出的输入。

答案2

尝试这个:

user@host:~$ read -d '' x <<EOF
> mic
> check
> one
> two
> EOF

没有换行符:

user@host:~$ echo $x
mic check one two

换行符:

user@host:~$ echo "$x"
mic
check
one
two

答案3

参考优秀Bash 指南满足您所有的 bash 脚本需求。

特别是 Bash FAQ 中第 1 条中包含了以下内容:

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

答案4

我通过处理每一行直到出现空白行来解决这个问题。对于我的情况来说,这种方法已经足够好了。但如果有人想添加更好的解决方案,请随意添加。

echo "---
notes: |" > 'version.yml'

while read line
do
  # break if the line is empty
  [ -z "$line" ] && break
  echo "  $line" >> "source/application.yml"
done

相关内容