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

如何通过纯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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.17 00:28:15