千家信息网

如何理解bash readarray

发表于:2026-11-03 作者:千家信息网编辑
千家信息网最后更新 2026年11月03日,本篇内容主要讲解"如何理解bash readarray",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何理解bash readarray"吧!§ 0x01
千家信息网最后更新 2026年11月03日如何理解bash readarray

本篇内容主要讲解"如何理解bash readarray",感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习"如何理解bash readarray"吧!

§ 0x01 起源

工作中有如下需求,要去解析一个文件的内容,但文件是json格式的,我不想使用jq。通过grep过滤出符合要求的行,然后在for循环中处理它们。 然后发现,这样实现不行。

lines=$(grep xxxx /path/to/file.json)for line in ${lines}; do        echo ${line}done

grep输出的内容变成一行了。对比运行环境和ubuntu中,发现lines的内容不同。在运行环境中是一行(换行符消失了),在ubuntu是多行。换了sed之后,确认是bash实现的问题。不能去更新运行环境中bash的版本,就只能考虑其他实现方式了。

§ 0x02 readarry

查了资料之后发现readarray,一个bash的内置函数,可以实现这个需求,它还有个别名叫mapfile。个人感觉readarray更好理解一些。 它的实方式如下:

# 声明它是个列表delcare -a linesreadarray -t lines < <(grep xxx /path/to/file.json)for line in "${lines[@]}"; do        echo "${line}"done

尽管解决过程很短,readarry这种调用形式之前也见过一直不明白,为什么会是这种形式。

< <(grep xxx /path/to/file.json)

而且,两个<之间一定要有一个空格。第2个<要与小括号紧挨着。终于通过查看bash manual找到了答案。

§ 0x03 释疑

之前也查过,没有找到。这次通过<\(在man bash中搜索到了。原文如下 :

   Process Substitution       Process substitution allows a process's input or output to be referred to using a filename.  It takes the form of <(list) or >(list).  The process list is run asynchronously, and       its input or output appears as a filename.  This filename is passed as an argument to the current command as the result of the expansion.  If the >(list) form is used, writing to       the file will provide input for list.  If the <(list) form is used, the file passed as an argument should be read to obtain the output of list.  Process substitution is supported       on systems that support named pipes (FIFOs) or the /dev/fd method of naming open files.       When available, process substitution is performed simultaneously with parameter and variable expansion, command substitution, and arithmetic expansion.

意思是说,<(cmd)这种形式是进程替换的一种形式。<(cmd)可以作为一个文件出现。它是通过命名管道实现的。它出现的地方可以用一个文件来代替。 这也是为什么它可以在 <后出现。相当于是把文件的内容重定向到前一个命令的标准输入中了。这个过程是异步的,()中的命令可能先执行完。

疑问解答:

  1. 为什么<之间要有空格?因为<(cmd)是固定形式。

  2. 第1个<是什么作用?是输入重定向,将后面的文件的描述符,重定向到前面的命令的标准输入。

  3. 如何解释echo <(ls)的输出是/proc/self/fd/11?这也验证之前的说明,<(ls)是一个文件描述符,bash里的实现应该是从文件描述符中read,然后write到前面的命令标准输入中。与文件重定向的区别是,bash会自动区分,输入的是文件描述符还是文件。文件就先打开再读,描述符就直接读。

到此,相信大家对"如何理解bash readarray"有了更深的了解,不妨来实际操作一番吧!这里是网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

文件 内容 形式 输入 命令 标准 环境 运行 一行 之间 方式 过程 需求 学习 输出 不同 不行 实用 更深 两个 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 重庆互联网络科技 互联网科技的发展 互联网与新科技 互联网金融科技平台 互联网科技缩写 撒么互联网科技公司 互联网科技公司名称 哈尔滨秒房互联网科技有限公司 安控科技rtu产品工业互联网 西藏七维空间互联网科技有限公司 互联网教育科技公司vipkid 搜狐科技互联网 银川新华互联网科技学校联系电话 广州新华互联网科技学校电竞方面 深圳市罗太互联网科技有限公司 厦门江牛科技互联网 上海同邻互联网科技有限公司规模 张家口科技产业互联网平台 华人运通互联网科技公司 山东亿川互联网科技有限责任公司 中关村互联网科技集团 腾讯科技 互联网女皇 科技与互联网的利与弊 温州喔噻互联网科技有限公司 互联网科技热点资讯 互联网软件和科技 昊天互联网科技有限公司 互联网金融科技元年 互联网科技博主张洲 伍佰万互联网科技是干嘛的
0