『回复列表(14|显示机器人聊天)』
$ readarray -td $'\0' arr < <(jq -rj '[.[].name] | join("\u0000")' <<<'[{"id": 1, "name": "a\nb\n"}, {"id": 2, "name": "c\nd"}]')
$ declare -p arr
declare -a arr=([0]=$'a\nb\n' [1]=$'c\nd')
如果你不担心你的 name
里有换行符的话,可以直接:
$ readarray -t arr < <(jq -r '.[].name' <<<'[{"id": 1, "name": "ab"}, {"id": 2, "name": "cd"}]')
$ declare -p arr
declare -a arr=([0]='ab' [1]='cd')
主要是我其实更习惯用管道这样的方式
不能在匿名管道内修改外部的变量!(如:jq | readarray
、sum=0; seq 3 | while read -r i; do (( sum += i )); done
)
因为这会开启一个子 shell
,然后在子 shell
中,readarray
将 jq
的输出转成数组。
等这一行执行完毕,子 shell
就会退出,刚整理好的数组也随着进程结束而消失了。
所以,只能用 <<<
或 < <(...)
的形式。
前者需要完全准备好一个字符串,再作为 stdin
喂给所在的命令。我觉得没必要,没这么干
(试想,你拷贝一个 1GB 的文件,会申请 1GB 的内存,全部读取完成后,再写入至新文件吗?)
后者,<(...)
是将 ...
的 stdout
重定向至某个文件(一般是具名管道),然后将此文件作为 stdin
喂给所在命令
(如果是管道实现,则一般是 4KB 缓冲区)
但是当我单拧出来一个数组,那么结尾就会有一个换行🤣🤣
使用 readarray
时指定 -t
参数,会自动删除行末的换行符