如何在Bash脚本中为JSON文件批量填充单值与多值字段?
用jq填充JSON模板的单值字段与数组字段
1. 先定义脚本变量
在Bash脚本里声明需要填充的变量,包括单值和数组:
APP_ID="12345" APP_NAME="MyDemoApp" # 多值数组变量 GROUPS=("admin_group" "editor_group" "viewer_group") INCLUSION=("/api/v1/*" "/web/*")
2. 单值字段赋值
对于.appId、.appName这类单值字段,用--arg将Bash变量传递给jq,避免字符串转义问题,直接用=运算符赋值:
jq --arg app_id "$APP_ID" \ --arg app_name "$APP_NAME" \ '.appId = $app_id | .appName = $app_name' payload.json
3. 多值数组字段赋值
数组字段需要先把Bash数组转成jq能识别的JSON数组格式,再用--argjson传递:
# 将Bash数组转为JSON数组字符串 GROUPS_JSON=$(printf '%s\n' "${GROUPS[@]}" | jq -R . | jq -s .) INCLUSION_JSON=$(printf '%s\n' "${INCLUSION[@]}" | jq -R . | jq -s .)
4. 整合所有赋值逻辑
把单值和数组的赋值整合到一个jq命令里,输出到新的JSON文件(也可以直接覆盖原文件):
jq --arg app_id "$APP_ID" \ --arg app_name "$APP_NAME" \ --argjson groups "$GROUPS_JSON" \ --argjson inclusion "$INCLUSION_JSON" \ '.appId = $app_id | .appName = $app_name | .groups = $groups | .inclusion = $inclusion' payload.json > updated_payload.json
完整脚本示例
#!/bin/bash # 定义变量 APP_ID="12345" APP_NAME="MyDemoApp" GROUPS=("admin_group" "editor_group" "viewer_group") INCLUSION=("/api/v1/*" "/web/*") # 转换Bash数组为JSON数组 GROUPS_JSON=$(printf '%s\n' "${GROUPS[@]}" | jq -R . | jq -s .) INCLUSION_JSON=$(printf '%s\n' "${INCLUSION[@]}" | jq -R . | jq -s .) # 填充JSON模板 jq --arg app_id "$APP_ID" \ --arg app_name "$APP_NAME" \ --argjson groups "$GROUPS_JSON" \ --argjson inclusion "$INCLUSION_JSON" \ '.appId = $app_id | .appName = $app_name | .groups = $groups | .inclusion = $inclusion' payload.json > updated_payload.json # 可选:发送更新后的JSON到API curl -X POST -H "Content-Type: application/json" -d @updated_payload.json https://your-api-endpoint.com
关键注意事项
- 必须用
--arg(字符串类型)或--argjson(JSON格式)传递变量,不要直接在jq里拼接Bash变量,避免转义错误和注入风险 - 如果数组元素包含特殊字符(引号、斜杠等),
jq -R .会自动处理转义,生成合法的JSON数组 - 若要直接覆盖原文件,可安装
moreutils后用| sponge payload.json替代输出到新文件的逻辑
内容的提问来源于stack exchange,提问作者phoeneous
相关产品推荐
相关产品推荐

