如何将参数作为索引传递给jq?

5

您好,我希望能够访问以下JSON数组中给定元素:

$ echo '[  { "CT" : "OS1"  , "VERSION" : "3" } , { "CT" : "OS2"  , "VERSION" : "3" } ]'  | jq '.[1]'
{
  "CT": "OS2",
  "VERSION": "3"
}

然而,我希望在将来使用一个变量(从环境中获取),以替换上述命令中的索引“1”,但这会产生错误。

echo '[  { "CT" : "OS1"  , "VERSION" : "3" } , { "CT" : "OS2"  , "VERSION" : "3" } ]'  | jq --arg index 1 '.[$index]'
jq: error (at <stdin>:1): Cannot index array with string "1"

看起来无法将这个1解析为数字值,有人能帮我吗?

2个回答

9
您可以使用--argjson选项:
jq --argjson index 1 '.[$index]'

如在jq --help中所述:

--argjson a v 将变量$a设为JSON<v>


1
有人能解释一下为什么在这里使用arg而不是argjson不起作用吗,例如jq --arg index 1 '.[$index]'。我花了几个小时尝试使用arg来使其工作,而你的答案为我解决了这个问题。 - Dude0001
1
@Dude0001 --arg 将变量设置为字符串,而 --argjson 则将变量设置为 JSON 值,并在此情况下作为可用作索引数组的数字。 - oliv

2

如果您使用的是 jq 1.4 或更早版本,则可以使用 tonumber 函数:

jq --arg index 1 '.[$index | tonumber]'

如需更高版本,请参阅oliv的回答


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接