如何在bash shell脚本中读取多行输入到数组中

时间:2016-12-27 12:16:18

标签: arrays bash

这是在bash中将多行输入读入数组的正确方法吗?

arr=( $(cat) ); 
echo "{arr[@]}" 

我将这一行放入一个脚本中,我尝试通过在每行之后点击返回键来读取多个输入,但是脚本继续接受输入并且不会通过到达第二行来打印数组的元素,当我在输入控制台上按ctrl C,脚本终止。请建议从命令行读取多行输入的正确方法是否正确?

1 个答案:

答案 0 :(得分:6)

要解决的几点:

首先,不要使用Ctrl-C而是使用Ctrl-D来结束输入:Ctrl-C将破坏脚本(它发送SIGINT信号),而Ctrl-D是EOF(传输结束)。

要打印数组,每行一个字段,请使用

arr=( $(cat) )
printf '%s\n' "${arr[@]}"

现在,糟糕的方式:

hello word

这很糟糕,因为它受到单词拆分和路径名扩展的影响:尝试输入*mapfile,您会看到不好的事情发生。

要达到你想要的效果:使用Bash≥4你可以使用mapfile -t arr printf '%s\n' "${arr[@]}" ,如下所示:

arr=()
while IFS= read -r l; do
    arr+=( "$l" )
done
printf '%s\n' "${arr[@]}"

或者,对于旧版Bash,您可以使用循环:

arr=()
while IFS= read -r l; do
    printf '%s\n' "$l"
    arr+=( "$l" )
done

如果要打印每行的类型,可能更容易使用循环版本:

mapfile

如果您喜欢冒险,可以使用cb() { printf '%s\n' "$2"; } mapfile -t -c1 -C cb arr 的回调:

{{1}}