如何在Bash脚本中读取多行输入?

9

我希望通过shell脚本将从“粘贴”中获取的多行文本保存在文件和变量中。简单的read命令只能读取第一行。

有什么方法可以实现这个需求呢?

例如:

echo "Paste the  certificate key:" 

1fv765J85HBPbPym059qseLx2n5MH4NPKFhgtuFCeU2ep6B19chh4RY7ZmpXIvXrS7348y0NdwiYT61
1RkW75vBjGiNZH4Y9HxXfQ2VShKS70znTLxlRPfn3I7zvNZW3m3zQ1NzG62Gj1xrdPD7M2rdE2AcOr3
Pud2ij43br4K3729gbG4n19Ygx5NGI0212eHN154RuC4MtS4qmRphb2O9FJgzK8IcFW0sTn71niwLyi
JOqBQmA5KtbjV34vp3lVBKCZp0PVJ4Zcy7fd5R1Fziseux4ncio32loIne1a7MPVqyIuJ8yv5IJ6s5P
485YQX0ll7hUgqepiz9ejIupjZb1003B7NboGJMga2Rllu19JC0pn4OmrnxfN025RMU6Qkv54v2fqfg
UmtbXV2mb4IuoBo113IgUg0bh8n2bhZ768Iiw2WMaemgGR6XcQWi0T6Fvg0MkiYELW2ia1oCO83sK06
2X05sU4Lv9XeV7BaOtC8Y5W7vgqxu69uwsFALripdZS7C8zX1WF6XvFGn4iFF1e5K560nooInX514jb
0SI6B1m771vqoDA73u1ZjbY7SsnS07eLxp96GrHDD7573lbJXJa4Uz3t0LW2dCWNy6H3YmojVXQVYA1
v3TPxyeJD071S20SBh4xoCCRH4PhqAWBijM9oXyhdZ6MM0t2JWegRo1iNJN5p0IhZDmLttr1SCHBvP1
kM3HbgpOjlQLU8B0JjkY8q1c9NLSbGynKTbf9Meh95QU8rIAB4mDH80zUIEG2qadxQ0191686FHn9Pi

读取并将其存储在名为 /tmp/keyfile 的文件中, 读取并将其存储在变量 $keyvariable 中


1
“read not working” 是什么意思?你尝试了什么,它是如何失败的? - John1024
通常情况下,read命令用于存储标准输入,但在这种情况下它是无用的,因为通常提供的代码片段是通过粘贴并具有多行。实际上,我不知道该怎么做。 - Alan
1个回答

47

您只需要决定要读取多少内容。

如果这是唯一的输入,您可以一直读取直到文件结束。这就是大多数UNIX实用程序的工作方式:

#!/bin/bash
echo "Pipe in certificate, or paste and it ctrl-d when done"
keyvariable=$(cat)

如果您想在脚本中继续阅读内容,可以一直阅读,直到看到一个空行:
#!/bin/bash
echo "Paste certificate and end with a blank line:"
keyvariable=$(sed '/^$/q')

如果你希望它在交互中更像魔法,你可以读取脚本直到两秒没有输入:

#!/bin/bash
echo "Paste your certificate:"
IFS= read -d '' -n 1 keyvariable   
while IFS= read -d '' -n 1 -t 2 c
do
    keyvariable+=$c
done
echo "Thanks!" 

1
不好意思,我无法完成这个请求。这是不恰当的内容。 - Alan
不确定为什么这个被关闭了...本来想再添加一个答案,但是:在bash命令行上使用cat | othercmd应该也可以解决问题。具体来说,我试图压缩一些JS代码而不将其保存到文件中,所以我使用了:cat | uglifyjs --expr . 另外,小提示是似乎没有fish(我的常用shell)的等效命令。 - smaudet
@smaudet cat 没有任何作用。你可以直接粘贴到 uglifyjs --expr 中。这是因为 uglifyjs 使用了上述技术之一。 - that other guy
@smaudet,你有没有一个例子是毫无希望的情况? - that other guy
@thatotherguy- 不幸的是,不 - 看起来这个问题大约一个月前发生了,而我现在已经换了笔记本电脑。我也没有gist它。如果我必须猜测我的用例,那么就是类似于使用jq提取单个属性的操作。同时,uglifyjs也可能已经有所改进,所以我不知道这个论点是否成立。关键是,如果你要管道输出到的工具(比如uglifyjs)在设计上不足,cat是一个有用的工具,只需要三个字符,而你的答案则要长得多。 - smaudet
显示剩余7条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接