如何在shell脚本中使用jq动态解析shell脚本中的json数组

时间:2015-08-12 15:35:09

标签: jq

假设我在json.txt文件中有以下json

{
  "first_name": "John",
  "last_name": "Smith",
  "things_carried": [
    "apples",
    "hat",
    "harmonica"
  ],
  "children": [
    {
      "first_name": "Bobby Sue",
      "last_name": "Smith"
    },
    {
      "first_name": "John Jr",
      "last_name": "Smith"
    }
  ]
}

在shell脚本中,我编写了使用jq工具查找子数组大小的逻辑。

size=cat json.txt | jq '.children | length'    
i=0

while [ $i -le $size ]    
do
    array[$i]=$(cat json.txt | jq '.children[$i]')
    i=`expr $i + 1`
done

在运行它时会出现以下错误 -

.children[$i]          1 compile error

似乎它无法替换children []数组中的变量i,因为如果我们给出表达式 -

array[$i]=$(cat json.txt | jq '.children[0]') 

运行良好。

有人可以帮助我。

3 个答案:

答案 0 :(得分:2)

您在jq程序周围使用单引号。 Shell不会在单引号内插入变量;这是故意的,因此jq手册建议在程序周围使用单引号。

jq为此提供了一个参数语法。此语法允许您将jq变量设置为shell变量的值。您可以使用以下命令替换当前的jq调用:

QA-244

答案 1 :(得分:1)

看起来你只是想把孩子设置为bash数组变量。

您不需要循环,只需直接设置数组。

$ IFS=$'\n'; array=($(jq -c '.children[]' json.txt))

答案 2 :(得分:-1)

您应该使用以下语法:

array[$i]=$(cat json.txt | jq '.children['${i}']')