这是在bash中将多行输入读入数组的正确方法吗?
arr=( $(cat) );
echo "{arr[@]}"
我将这一行放入一个脚本中,我尝试通过在每行之后点击返回键来读取多个输入,但是脚本继续接受输入并且不会通过到达第二行来打印数组的元素,当我在输入控制台上按ctrl C,脚本终止。请建议从命令行读取多行输入的正确方法是否正确?
答案 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}}