Bash脚本调用jq解析SonarQube接口返回JSON时facetsArr取值错误
错误原因
- 字段分割逻辑错误:Bash的
read命令默认按任意空白字符(空格、换行、制表符等)分割输入内容,你从jq输出的JSON结构里包含大量空格和换行,read会把第一个空白分隔的10057赋值给totalIssues,下一个空白分隔的内容(也就是issue对象的第一个字符{)赋值给facetsArr,剩下的所有内容全都塞给了issuesArr,自然取值完全错位。 - 输出顺序不匹配:你jq的取值顺序是
.total→.issues[]→.facets[].values,但接收变量的顺序是totalIssues→facetsArr→issuesArr,本来要给facetsArr的内容排在了issues的后面,就算分割正确也拿不到想要的值。 - 多余格式处理:
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
相关产品推荐
相关产品推荐

