在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" } ] } }
找不到问题所在,需要帮忙解决。
解决方案
你的问题出在两个核心点:
- 使用了
jq -R(原始字符串模式),把手动拼接的JSON片段当成纯字符串处理,导致最终数组里存的是字符串而非JSON对象; - 手动拼接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
相关产品推荐
相关产品推荐

