3
这是在bash中将多行输入读入数组的正确方法吗?如何在bash shell脚本中将多行输入读入数组
arr=($(cat));
echo "{arr[@]}"
我把这个行成一个剧本,我试图通过打每行后返回键读取多个输入,但剧本一直服用的输入,并且不通过来第二打印数组的元素行,当我在输入控制台按ctrl C脚本终止。请建议如果是从命令行读取多行输入的正确方法?
这是在bash中将多行输入读入数组的正确方法吗?如何在bash shell脚本中将多行输入读入数组
arr=($(cat));
echo "{arr[@]}"
我把这个行成一个剧本,我试图通过打每行后返回键读取多个输入,但剧本一直服用的输入,并且不通过来第二打印数组的元素行,当我在输入控制台按ctrl C脚本终止。请建议如果是从命令行读取多行输入的正确方法?
几点来解决:
首先,不使用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
thanks gniourf_gniourf – Vicky