数组 – 如何在bash shell脚本中读取多行输入到数组中
发布时间:2020-12-15 21:35:32 所属栏目:安全 来源:网络整理
导读:这是在bash中将多行输入读入数组的正确方法吗? arr=( $(cat) ); echo "{arr[@]}" 我把这一行放到一个脚本中,我尝试通过在每一行之后按回车键来读取多个输入,但是脚本继续接受输入并且当我按下ctrl C时不会通过到达第二行来打印数组的元素在输入控制台上脚本
这是在bash中将多行输入读入数组的正确方法吗?
arr=( $(cat) ); echo "{arr[@]}" 我把这一行放到一个脚本中,我尝试通过在每一行之后按回车键来读取多个输入,但是脚本继续接受输入并且当我按下ctrl C时不会通过到达第二行来打印数组的元素在输入控制台上脚本终止.请建议从命令行读取多行输入的正确方法是否正确? 解决方法
要点几点:
首先,不要使用Ctrl-C而是使用Ctrl-D来结束输入:Ctrl-C将破坏脚本(它发送SIGINT信号),而Ctrl-D是EOF(传输结束). 要打印数组,每行一个字段,请使用 printf '%sn' "${arr[@]}" 现在,糟糕的方式: arr=( $(cat) ) printf '%sn' "${arr[@]}" 这很糟糕,因为它受到单词拆分和路径名扩展的影响:尝试输入hello word或*,你会看到坏事发生. 要达到你想要的效果:使用Bash≥4你可以使用mapfile如下: mapfile -t arr printf '%sn' "${arr[@]}" 或者,使用传统Bash,您可以使用循环: arr=() while IFS= read -r l; do arr+=( "$l" ) done printf '%sn' "${arr[@]}" 如果要打印每行的类型,可能更容易使用循环版本: arr=() while IFS= read -r l; do printf '%sn' "$l" arr+=( "$l" ) done 如果您喜欢冒险,可以使用mapfile的回调,如下所示: cb() { printf '%sn' "$2"; } mapfile -t -c1 -C cb arr (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |