对bash变量使用jq会导致错误

  • 本文关键字:错误 jq bash 变量 bash jq
  • 更新时间 :
  • 英文 :


我有以下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永远是更好的选择。