我有以下json文件
{
"result": {
"run": {
"runtime": "runc"
},
"software": {
"runc": "1.1.2",
"kata": "1.3.7"
}
}
}
我可以使用
提取运行时信息# jq -r '.result.software .runc' input.json
1.1.2
然而,如果我尝试动态提取版本号,它不起作用(运行时可以改变)
# runtime=$(jq -r '.result.run .runtime' input.json)
# jq --arg key "$runtime" '.result.software .[$key]'
jq: error: syntax error, unexpected '[', expecting FORMAT or QQSTRING_START (Unix shell quoting issues?) at <top-level>, line 1:
.result.software .[$key]
jq: 1 compile error
组合点表示法仅适用于文字名称。使用.result.software[$key]
代替:
runtime="$(jq -r '.result.run.runtime' input.json)"
jq -r --arg key "$runtime" '.result.software[$key]'
1.1.2
如果动态值总是计算同一个JSON文件的结果,并且您在shell脚本的其他地方不需要该值,则可以在内部解决该问题,并将脚本减少到只调用一次jq:
jq -r '.result.run.runtime as $key | .result.software[$key]' input.json
演示或者根本不使用变量:
jq -r '.result | .software[.run.runtime]' input.json
演示注意:永远不要在代码中使用双引号注入数据。--arg
永远是更好的选择。