加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

数组 – 如何在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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读