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

Bash脚本调用jq解析SonarQube接口返回JSON时facetsArr取值错误

错误原因
  1. 字段分割逻辑错误:Bash的read命令默认按任意空白字符(空格、换行、制表符等)分割输入内容,你从jq输出的JSON结构里包含大量空格和换行,read会把第一个空白分隔的10057赋值给totalIssues,下一个空白分隔的内容(也就是issue对象的第一个字符{)赋值给facetsArr,剩下的所有内容全都塞给了issuesArr,自然取值完全错位。
  2. 输出顺序不匹配:你jq的取值顺序是.total→.issues[]→.facets[].values,但接收变量的顺序是totalIssues→facetsArr→issuesArr,本来要给facetsArr的内容排在了issues的后面,就算分割正确也拿不到想要的值。
  3. 多余格式处理:echo $(curl ...)的写法会把curl输出的所有换行替换为空格,进一步打乱了jq原本的输出结构;同时jq加了-r参数,对于保留JSON结构的需求来说不需要,会破坏JSON的格式完整性。
修复方案

调整思路:用jq将三个需要的字段按正确顺序输出,用不会出现在JSON中的特殊分隔符分割,再指定read用对应分隔符做字段拆分。
修复后的脚本如下:

#!/bin/bash
readonly BASE_URL=http://my_host:9111/api
readonly PROJECT_KEY=my_project

# 用不可见字符\x01作为分隔符,避免和JSON内容冲突
IFS=$'\x01' read -r totalIssues facetsArr issuesArr < <(
    curl -s "$BASE_URL/issues/search?componentKeys=$PROJECT_KEY&facets=severities&p=1&ps=1" |
    jq -j '(.total|tostring), "\x01", (.facets[].values|tojson), "\x01", (.issues|tojson)'
)

echo "total      : $totalIssues"
echo "facetsArr  : $facetsArr"
echo "issuesArr  : $issuesArr"

代码说明

  • 去掉了多余的echo $(...)嵌套,直接用curl的输出传给jq
  • jq用-j参数不自动加换行,手动插入\x01作为字段分隔符
  • 所有JSON类型的输出都用tojson方法转为完整的JSON字符串,保证结构完整
  • read指定IFS=$'\x01'用对应分隔符拆分字段,保证每个变量刚好拿到对应内容
  • 调整了输出顺序为total→facets.values→issues,和接收变量顺序匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 19:36:03