『回复列表(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 参数,会自动删除行末的换行符