这是在bash中将多行输入读入数组的正确方法吗?
arr=( $(cat) );
echo "{arr[@]}"
Run Code Online (Sandbox Code Playgroud)
我把这一行放到一个脚本中,我尝试通过在每一行之后按回车键来读取多个输入,但是脚本继续接受输入并且当我按下ctrl C时不会通过到达第二行来打印数组的元素在输入控制台上脚本终止.请建议从命令行读取多行输入的正确方法是否正确?
要点几点:
首先,不要使用Ctrl-C而是使用Ctrl-D来结束输入:Ctrl-C将破坏脚本(它发送SIGINT信号),而Ctrl-D是EOF(传输结束).
要打印数组,每行一个字段,请使用
printf '%s\n' "${arr[@]}"
Run Code Online (Sandbox Code Playgroud)
现在,糟糕的方式:
arr=( $(cat) )
printf '%s\n' "${arr[@]}"
Run Code Online (Sandbox Code Playgroud)
这很糟糕,因为它受到单词拆分和路径名扩展的影响:尝试输入hello word或者*你会看到坏事发生.
要达到你想要的效果:使用Bash≥4你可以使用mapfile如下:
mapfile -t arr
printf '%s\n' "${arr[@]}"
Run Code Online (Sandbox Code Playgroud)
或者,使用传统Bash,您可以使用循环:
arr=()
while IFS= read -r l; do
arr+=( "$l" )
done
printf '%s\n' "${arr[@]}"
Run Code Online (Sandbox Code Playgroud)
如果要打印每行的类型,可能更容易使用循环版本:
arr=()
while IFS= read -r l; do
printf '%s\n' "$l"
arr+=( "$l" )
done
Run Code Online (Sandbox Code Playgroud)
如果你mapfile喜欢冒险,你可以像这样使用回调:
cb() { printf '%s\n' "$2"; }
mapfile -t -c1 -C cb arr
Run Code Online (Sandbox Code Playgroud)