首页 > 解决方案 > jq,变量,选择和数字?

问题描述

似乎 jq 的“选择”与变量一起使用时,仅适用于文本字符串,但不适用于数字。如何使用 jq 以便无论值是否为数字都可以选择?

$ cat test.json
[
  {
    "id": "some-text",
    "output": "jq select works!"
  },
  {
    "id": 123,
    "output": "jq select doesn't work :("
  }
]
$ ID="some-text"
$ cat test.json | jq -r --arg ID "$ID" '.[] | select(.id==$ID) | .output'
jq select works!
$ 
$ ID="123"
$ cat test.json | jq -r --arg ID "$ID" '.[] | select(.id==$ID) | .output'
$ 
$ cat test.json | jq -r '.[] | select(.id==123) | .output'
jq select doesn't work :(

我究竟做错了什么?

标签: jsonjq

解决方案


您可以使用--argjsonoff-arg来让 JQ 将其作为数字处理:

➜  ID="123"
➜  cat test.json | jq -r --argjson ID "$ID" '.[] | select(.id==$ID) | .output'
jq select doesn't work :(
➜  

您还可以使用tostring将 ID 转换为字符串,以便保留现有格式;

➜  ID="123"
➜  cat test.json | jq -r --arg ID "$ID" '.[] | select(.id|tostring==$ID) | .output'
jq select doesn't work :(
➜ 
➜  ID="some-text"
➜  cat test.json | jq -r --arg ID "$ID" '.[] | select(.id|tostring==$ID) | .output'
jq select works!
➜ 

推荐阅读