要点几点:
首先,不要使用Ctrl-C而是使用Ctrl-D来结束输入:Ctrl-C将破坏脚本(它发送SIGINT信号),而Ctrl-D是EOF(传输结束).
要打印数组,每行一个字段,请使用
printf '%s\n' "${arr[@]}"
现在,糟糕的方式:
arr=( $(cat) )
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
如果您喜欢冒险,可以使用mapfile的回调,如下所示:
cb() { printf '%s\n' "$2"; }
mapfile -t -c1 -C cb arr