如何通过纯Shell方式将环境变量插值到JSON文件中?
纯Shell实现JSON环境变量插值的方案
需求场景
现有JSON文件 a.json,内容如下:
{"hello": "$WHO"}
已通过 export WHO=world 设置环境变量,需要将JSON中的环境变量引用替换为实际值,生成新的JSON文件:
{"hello": "world"}
方法一:利用eval快速替换(适合简单场景)
直接通过eval解析JSON内容中的变量引用,适合变量内容不含特殊字符的情况:
eval "echo \"$(cat a.json)\"" > output.json
注意:如果变量值包含双引号、反斜杠等字符,会破坏JSON结构,仅推荐用于可控的简单场景。
方法二:遍历环境变量批量替换(更灵活)
通过遍历所有环境变量,用sed替换文件中的变量引用,同时处理sed特殊字符转义:
#!/bin/sh input="a.json" output="output.json" cp "$input" "$output" # JSON转义函数:处理双引号、反斜杠、换行符 json_escape() { printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g' } # 遍历环境变量并替换 for var in $(printenv | cut -d= -f1); do value=$(json_escape "$(printenv "$var")") escaped_var=$(printf '%s' "$var" | sed 's/[\/&]/\\&/g') sed -i "s/\$$escaped_var/$value/g" "$output" done
这个方法支持批量替换多个环境变量,且通过json_escape函数保证生成的JSON格式合法。
方法三:Shell字符串替换(纯内置命令)
利用Shell的字符串替换功能,仅依赖Shell内置命令实现:
#!/bin/sh input="a.json" output="output.json" content=$(cat "$input") # JSON转义函数 json_escape() { printf '%s' "$1" | sed 's/\\/\\\\/g; s/"/\\"/g; s/\n/\\n/g' } # 遍历环境变量替换内容 while IFS='=' read -r var val; do escaped_val=$(json_escape "$val") content=${content//\$$var/$escaped_val} done < <(printenv) printf '%s\n' "$content" > "$output"
此方法全程使用Shell内置的字符串处理能力,仅在JSON转义时用到sed,若无需处理特殊字符,可直接去掉json_escape部分。
内容的提问来源于stack exchange,提问作者TieDad
相关产品推荐
相关产品推荐

