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

Bash操作JSON时无法将条目添加到issues数组末尾,部分条目出现在数组外

问题原因分析与解决方案

核心问题原因

  • 字符串处理JSON的不稳定性:你通过${currentIssuesArr:1:${#currentIssuesArr}-2}手动剥除数组首尾方括号的方式,强依赖jq的输出格式完全固定,一旦接口返回的issue内容包含转义方括号、或者jq输出带首尾换行/空格,切片后的内容就会出现JSON语法错误,导致后续解析结构错乱。就算你确认切片得到的内容正确,后续步骤依然存在问题。
  • Shell变量注入jq的语法风险:你把处理后的resultIssues直接拼接到jq表达式中,如果resultIssues包含双引号、空格、换行、jq语法特殊字符,Shell会先做分词、特殊字符转义处理,导致jq拿到的表达式本身就存在语法错误,自然会出现内容错位、条目写到数组外的问题。
  • jq数组追加逻辑错误:你使用的.issues[.issues| length] |= . + $resultIssues逻辑本身不符合要求:这个表达式的含义是「给现有issues数组的最后一个元素追加值」,而不是「给issues数组追加新元素」。当你传入多个逗号分隔的JSON对象时,jq会解析失败,多出来的元素会被当成顶层内容直接写到数组外层,正好匹配你遇到的现象。

修复方案

完全放弃手动处理JSON字符串的操作,直接使用jq原生的数组合并能力+安全的变量传参方式即可:

#!/bin/bash
for (( pageNumber=1; pageNumber<=$COUNT_PAGES; pageNumber++ ))        
do
    # 拉取当前页完整的issues数组,不做字符串处理
    new_issues=$(curl -s -XGET "$BASE_URL/issues/search?componentKeys=$PROJECT_KEY&p=$pageNumber&ps=$PAGE_SIZE" | jq '.issues')
    # 用--argjson安全传入JSON变量,直接合并数组,通过临时文件避免原文件损坏
    jq --argjson add_items "$new_issues" '.issues += $add_items' "$FILE_REPORT" > "$FILE_REPORT.tmp" && mv "$FILE_REPORT.tmp" "$FILE_REPORT"
done

内容的提问来源于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 11:54:10