You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Bash中用JQ筛选匹配数组ID的JSON元素值?

从JSON中筛选匹配Bash数组ID的value值

问题背景

需要编写Shell脚本,从包含ID和对应value的JSON文件中,筛选出匹配Bash数组内ID的元素的value值。直接测试硬编码ID的jq命令有效,但参数化传递Bash数组时,脚本始终报错unexpected INVALID_CHARACTER。

示例数据

  • JSON文件(file.json):
[
 {
   "id": 1,
   "value": 10
 },   
 {
   "id": 2,
   "value": 100
 },
 {
   "id": 3,
   "value": 5
 },
 {
   "id": 4,
   "value": 17
 },
 {
   "id": 5,
   "value": 84
 }
]
  • Bash数组:
IDS=(1 2 3 4)
  • 期望结果:10、100、5、17

错误原因

之前尝试的命令错误在于直接将Bash数组(空格分隔的字符串)传给jq --argjson,而--argjson要求传入的必须是合法的JSON格式数据,导致解析失败报错。

解决方法

核心是先将Bash数组转换为JSON格式的数组,再传递给jq进行筛选:

方法1:分两步处理

  1. 将Bash数组转为JSON数组:
JSON_IDS=$(jq -n --args '$ARGS.positional' "${IDS[@]}")
  1. 用jq筛选匹配的value:
VALUES=$(jq --argjson ids "$JSON_IDS" '.[] | select(.id | IN($ids[])) | .value' file.json)

方法2:合并为单行命令

VALUES=$(jq --argjson ids "$(jq -n --args '$ARGS.positional' "${IDS[@]}")" '.[] | select(.id | IN($ids[])) | .value' file.json)

可选:输出逗号分隔的结果

如果需要将结果转为逗号分隔的字符串,可调整jq命令:

VALUES=$(jq --argjson ids "$(jq -n --args '$ARGS.positional' "${IDS[@]}")" '[.[] | select(.id | IN($ids[])) | .value] | join(", ")' file.json)

验证结果

运行上述命令后,VALUES变量将包含目标value值:

  • 分行输出时:每行一个value(10、100、5、17)
  • 逗号分隔输出时:"10, 100, 5, 17"

内容的提问来源于stack exchange,提问作者Silkking

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 08:35:29