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

如何修改脚本使jq读取JSON内环境变量时命令替换可正常执行

问题原因
  • 你当前脚本的问题有两点:
    1. jq调用逻辑冲突:你同时用管道给jq传了$values的输出,又给jq传了文件参数$1,jq会优先读取文件内容,管道输入会被直接忽略,需要先统一数据源逻辑。
    2. jq输出的key=value是普通字符串,shell默认不会解析字符串内部的$()命令替换、变量展开等语法,只有手动执行语句或者用eval触发shell解析时,这些语法才会生效。
修复方案

安全提示

该方案依赖eval执行动态内容,仅适用于你完全信任JSON文件内容的场景,如果JSON可能被第三方篡改,会存在任意命令执行的安全风险。

修改后的脚本如下:

#!/bin/bash
# 校验传入的JSON文件是否存在
if [ ! -f "$1" ]; then
    echo "请传入合法的JSON文件路径"
    exit 1
fi

IFS=$'\n'
# 移除多余的管道输入,直接从指定JSON文件读取内容
for s in $(jq -r 'to_entries|map("\(.key)=\(.value|tostring)")|.[]' "$1"); do
    # 用eval触发shell解析字符串内的命令替换逻辑
    eval "export $s"
    # 输出解析后的实际值做验证
    eval echo "$s"
done
unset IFS

效果验证

执行脚本后执行echo $PASSPHRASE即可看到输出为/home/x/secret的文件内容,和手动执行export语句的效果完全一致。

内容的提问来源于stack exchange,提问作者user2625247

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 15:57:03