假设我在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]')
运行良好。
有人可以帮助我。
答案 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}']')