2016-12-27 230 views
3

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

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

我把这个行成一个剧本,我试图通过打每行后返回键读取多个输入,但剧本一直服用的输入,并且不通过来第二打印数组的元素行,当我在输入控制台按ctrl C脚本终止。请建议如果是从命令行读取多行输入的正确方法?

回答

6

几点来解决:

首先,不使用Ctrl-C,但按Ctrl-d以结束输入:Ctrl-C键将打破脚本(它发送SIGINT信号),而按Ctrl-d是EOF(传输结束)。

要打印的阵列,每行一个字段,使用

printf '%s\n' "${arr[@]}" 

现在,坏的方式:

​​

这是不好的,因为它受到字的拆分和路径扩展:尝试输入hello word*,你会看到不好的事情发生。

达到你想要的东西:与Bash≥4你可以使用mapfile如下:

mapfile -t arr 
printf '%s\n' "${arr[@]}" 

,或者与传统的Bash,你可以使用一个循环:

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

如果你想打印每一行,因为它是打字,它可能更容易使用循环版本:

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

如果你感觉adv惹火,你可以使用mapfile的回调如下:

cb() { printf '%s\n' "$2"; } 
mapfile -t -c1 -C cb arr 
+0

thanks gniourf_gniourf – Vicky