如何在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:分两步处理
- 将Bash数组转为JSON数组:
JSON_IDS=$(jq -n --args '$ARGS.positional' "${IDS[@]}")
- 用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
相关产品推荐
相关产品推荐

