循环通过json数组不工作 - jq

时间:2018-03-16 02:51:46

标签: bash jq

我有一个JSON数组 conf =

 [ { "fraudThreshold": 4, "fraudTTLSec": 60 }, { "fraudThreshold": 44, "fraudTTLSec": 60 } ]

我想循环其项目。所以我做了以下事情:

for configy in $(echo "${conf}" | jq -r ".[]"); do 
    echo configy=$configy 
done

结果如下: -

configy={
configy="fraudThreshold":
configy=4,
configy="fraudTTLSec":

依此类推。

它使用空格分割字符串并逐个给出结果。 为什么bash表现出这种奇怪的行为?这有什么解决方案吗?

此外,当我这样做时,它会给出正确的值:

configy=$(echo $conf | jq .[-1])
echo configy=$configy 

结果:

 configy={ "fraudThreshold": 44, "fraudTTLSec": 60 }

3 个答案:

答案 0 :(得分:4)

为了使用bash遍历JSON数组中的项目,您可以编写:

echo "${conf}" | jq -cr ".[]" |
while read -r configy
do
  echo configy="$configy"
done

这会产生:

configy={"fraudThreshold":4,"fraudTTLSec":60}
configy={"fraudThreshold":44,"fraudTTLSec":60}

然而,几乎肯定有更好的方法来实现你的最终目标。

答案 1 :(得分:1)

echo "${conf}" | jq -car '.[] | "configy=" + tojson'

产生

configy={"fraudThreshold":4,"fraudTTLSec":60}
configy={"fraudThreshold":44,"fraudTTLSec":60}

答案 2 :(得分:0)

for configy in $(echo "${conf}" | jq -r ".[]"); do 
     

它使用空格分割字符串并逐个给出结果。为什么bash表现出这种奇怪的行为?

这种行为一点都不奇怪。请参阅Bash Reference Manual: Word Splitting

  

shell扫描参数扩展命令的结果   替换和未发生的算术扩展   用于分词的双引号。

  

有没有解决方案?

MâttFrëëman和峰会提出了可行的解决方案;您可以将echo "${conf}" |替换为<<<"$conf"来略微优化它们。