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

Bash调用jq通过变量追加JSON数组元素报变量未定义如何解决

报错原因
  • Bash变量和jq的内部变量是完全隔离的,你将$currentIssuesArr写在单引号包裹的jq表达式中时,Bash不会解析替换这个变量,jq会将它识别为自身的内部变量,而你没有向jq传递该变量,因此直接报未定义错误。
  • 原有获取currentIssuesArr的写法存在逻辑缺陷:read -r默认仅读取一行内容,如果curl返回的issues包含多条数据,会直接截断丢失剩余内容;同时你使用了jq -r输出原始非JSON格式的内容,后续传入jq作为JSON节点时会存在格式兼容问题。
  • 存在隐藏逻辑问题:你每次循环都将结果重定向覆盖到test.json,循环结束后只会保留最后一页的处理结果,之前页的追加操作都会被覆盖。
解决方案

使用jq的--argjson参数传递JSON格式的Bash变量,同时调整内容读取逻辑,参考修改后的代码:

for (( pageNumber=$page; pageNumber<=$countPages; pageNumber++ ))         
do
    # 直接保存接口返回的issues数组的JSON内容,去掉-r参数,不要用read截断
    currentIssuesArr=$(curl -s -XGET "$BASE_URL/issues/search?componentKeys=$PROJECT_KEY&p=$pageNumber&ps=$PAGE_SIZE" | jq '.issues[]')
    # 用--argjson把bash变量传入jq内部,名称和表达式内的变量对应
    jq --argjson addItem "$currentIssuesArr" '.issues[.issues| length] += $addItem' "$FILE_REPORT_RESULT" > tmp.json && mv tmp.json "$FILE_REPORT_RESULT"
done

如果需要一次性追加单页所有issue到数组,可以简化写法,效率更高:

for (( pageNumber=$page; pageNumber<=$countPages; pageNumber++ ))         
do
    currentIssuesArr=$(curl -s -XGET "$BASE_URL/issues/search?componentKeys=$PROJECT_KEY&p=$pageNumber&ps=$PAGE_SIZE" | jq '.issues')
    jq --argjson addItems "$currentIssuesArr" '.issues += $addItems' "$FILE_REPORT_RESULT" > tmp.json && mv tmp.json "$FILE_REPORT_RESULT"
done

如果不需要修改原文件,只需要输出到test.json,将代码里的重定向和mv逻辑改为> test.json即可。

内容的提问来源于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 04:36:00