将 JQ NULL 分隔的输出存储在 bash 数组中

GGe*_*ets 3 bash nul jq

在 bash 4.4.12 上使用 jq 1.5 和这个单行IFS=_ read -r -a a < <(jq -ncj '["a","b","c"][]+"_"') ; printf '%s\n' "${a[@]}"我得到一个正确分隔的输出

一种

C

分别对于元素 a、b 和 c,但是如果我尝试使用空分隔符进行相同的操作,如下所示:IFS= read -r -a a < <(jq -ncj '["a","b","c"][]+"\u0000"') ; printf '%s\n' "${a[@]}"那么我将只得到一个包含

美国广播公司

为什么这不像预期的那样工作?

此外,如果你尝试IFS= read -r -d '' -a a < <(jq -ncj '["a","b","c"][]+"\u0000"') ; printf '%s\n' "${a[@]},你会惊讶地得到一个只有第一个“ a ”元素的数组:

一种

我的目标是找到一种方法,而不用任何类型的循环迭代元素。

编辑:**readarray -d**不是解决方案,因为我需要在 4.4 版之前的 bash 中运行一段代码

che*_*ner 5

使用readarray,它获得了-d类似于同一选项上readbash4.4:

$ readarray -d $'\0' -t a < <(jq -ncj '["a","b","c"][]+"\u0000"')
$ declare -p a
declare -a a=([0]="a" [1]="b" [2]="c")
Run Code Online (Sandbox Code Playgroud)

-d ''也能用;由于 shell 字符串以空字符结尾,''因此从技术上讲,它是包含空字符的字符串。


在没有readarray -d支持的情况下,您可以使用while循环 with read,它应该适用于以下任何版本bash

a=()
while read -d '' -r item; do
    a+=("$item")
done < <( jq -ncj '["a","b","c"][]+"\u0000"' )
Run Code Online (Sandbox Code Playgroud)

这是你能做的最好的事情,除非你知道一些关于数组元素的知识,这会让你选择一个不属于任何元素的替代分隔符。

  • 这通常是您切换到具有正确数据结构和 JSON 库的语言的时刻。 (2认同)