如何在Bash脚本中动态更新变量内JSON字段的值?
在Bash脚本中更新JSON变量的baseUrl字段
问题背景
你通过以下命令将API返回的JSON数据存储到data变量中:
data=$(curl -s --location --request GET "${HOST}/api/v1/envs/projects/${PROJECT_ID}?page=0&pageSize=25" --header "Accept: application/json" --header "Content-Type: application/json" --header "Authorization: Bearer "$token"" | jq -r '.data[]')
输出的JSON结构如下:
{ "id": "8aa0809085f46e000185f4c28b7a0b52", "createdBy": "8aa0808e82fd01fb0182fd0b05820007", "createdDate": "2023-01-27T19:44:28.538+0000", "modifiedBy": "8aa0808e82fd01fb0182fd0b05820007", "modifiedDate": "2023-01-27T19:45:14.811+0000", "version": null, "inactive": false, "projectId": "8aa0809085f46e000185f4c28b760b51", "name": "Master", "refId": "Master", "description": null, "baseUrl": "http://petstore.swagger.io/v1" }
需要动态更新baseUrl字段,并将更新后的完整JSON保存到变量中用于后续操作。
解决方案
使用jq工具(Bash处理JSON的标准工具)来修改字段,步骤如下:
1. 修正原数据存储命令(可选但推荐)
原命令中jq -r '.data[]'会将JSON对象转为无格式的文本输出,建议保留完整JSON结构,方便后续处理:
# 获取数组中的第一个JSON对象(如果接口返回多个对象,可根据需求调整) data=$(curl -s --location --request GET "${HOST}/api/v1/envs/projects/${PROJECT_ID}?page=0&pageSize=25" \ --header "Accept: application/json" \ --header "Content-Type: application/json" \ --header "Authorization: Bearer $token" | jq '.data[0]')
2. 更新baseUrl字段
定义新的baseUrl值,通过jq的--arg参数传递变量(避免字符串转义问题),生成更新后的JSON:
# 定义新的baseUrl new_base_url="https://your-new-api-domain.com/v2" # 生成更新后的JSON,保存到新变量 updated_data=$(echo "$data" | jq --arg new_url "$new_base_url" '.baseUrl = $new_url') # 或者直接覆盖原变量 # data=$(echo "$data" | jq --arg new_url "$new_base_url" '.baseUrl = $new_url')
3. 验证结果
执行以下命令查看更新后的JSON:
echo "$updated_data"
4. 批量更新数组中所有对象的baseUrl(如果需要)
如果原接口返回的是多个环境对象的数组(data变量存储的是JSON数组),可以用map函数批量更新:
# 获取完整的data数组 data=$(curl ... | jq '.data') # 批量更新所有对象的baseUrl updated_data=$(echo "$data" | jq --arg new_url "$new_base_url" 'map(.baseUrl = $new_url)')
注意事项
- 确保系统已安装
jq工具,可通过apt install jq(Debian/Ubuntu)或yum install jq(CentOS/RHEL)安装。 - 使用
--arg传递变量是最安全的方式,避免手动拼接JSON时出现引号或特殊字符转义错误。
内容的提问来源于stack exchange,提问作者devops-admin
相关产品推荐
相关产品推荐

