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

在Bash脚本中向JSON对象添加键值对的格式问题求助

问题:通过Bash脚本向JSON添加命令行参数传递的键值对

我希望向现有JSON字符串中添加多个键值对,这些值通过命令行参数传递给我的Bash脚本。

目前编写的代码如下:

data='{"update": { "labels": [] } }'

for label in "${@}";do
   objJSON=$(printf '%s\n' "{ "add": ${label} }" | jq -R . | jq -s .)
   data=$(echo ${data} | jq  --argjson jsonString "$objJSON" '.update.labels += $jsonString')
done
echo ${data} >output.txt

jq --color-output . output.txt

当前输出为:

{
  "update": {
    "labels": [
      "{ add: value1 }",
      "{ add: value2 }"
    ]
  }
}

但我期望得到的输出是(注意add和每个值都带有引号):

{
  "update": {
    "labels": [
      { "add": "value1" },
      { "add": "value2" }
    ]
  }
}

找不到问题所在,需要帮忙解决。

解决方案

你的问题出在两个核心点:

  1. 使用了jq -R(原始字符串模式),把手动拼接的JSON片段当成纯字符串处理,导致最终数组里存的是字符串而非JSON对象;
  2. 手动拼接JSON时引号未正确转义,生成的内容不符合JSON语法规范。

修正后的循环实现

直接通过jq的--arg参数传递变量,让jq自动生成符合规范的JSON对象,避免手动拼接的错误:

data='{"update": { "labels": [] } }'

for label in "${@}"; do
  # 用--arg将命令行参数传入jq,生成正确的JSON对象并追加到数组
  data=$(echo "$data" | jq --arg val "$label" '.update.labels += [{"add": $val}]')
done

echo "$data" > output.txt
jq --color-output . output.txt

更高效的一次性处理方案

循环多次调用jq会带来性能损耗,尤其当参数较多时,可以一次性将所有参数传给jq完成构建:

# 读取所有命令行参数,一次性生成目标JSON
printf '%s\n' "${@}" | jq -n '{update: {labels: [inputs | {add: .}]}}' > output.txt

jq --color-output . output.txt

这种方式利用jq -n从头构建JSON,inputs会读取标准输入的每一行(即每个命令行参数),自动将每个参数转换为{add: .}的JSON对象,最终组合成labels数组,代码更简洁高效。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 11:07:40