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

如何在Shell中为.env文件无值变量填充对应预定义变量值?

解决.env文件无值变量填充预定义值的问题

问题背景

已预定义如下Shell变量:

var1="test"
var2="test2"

现有.env文件内容:

var1
var2
var3=test3

需求:读取该.env文件,为无赋值的行补充对应预定义变量的值,已有赋值的行保持不变,最终输出结果应为:

var1=test
var2=test2
var3=test3

当前编写的Shell函数无法正确获取预定义变量的实际值,需要调整变量引用方式。

解决方案

在Shell中要通过变量名动态获取其值,需使用间接变量引用。推荐使用${!var}语法(bash 4及以上版本支持),安全且简洁。

修改后的Shell函数

function populate_envs {
  while IFS= read -r line || [[ -n "$line" ]]; do
    if [[ $line =~ "=" ]]; then
      printf '%s\n' "$line"
    else
      # 间接引用获取预定义变量的值
      printf '%s=%s\n' "$line" "${!line}"
    fi
  done < "$1"
}

兼容低版本bash的方案(使用eval)

如果你的bash版本低于4,不支持${!var}语法,可以改用eval命令(注意仅处理信任的.env文件,避免注入风险):

function populate_envs {
  while IFS= read -r line || [[ -n "$line" ]]; do
    if [[ $line =~ "=" ]]; then
      printf '%s\n' "$line"
    else
      # 通过eval间接获取变量值
      printf '%s=%s\n' "$line" "$(eval echo "\$$line")"
    fi
  done < "$1"
}

说明

  • ${!line}的作用:先解析line变量的内容(比如当前行是var1,则line的值为var1),再获取名为var1的预定义变量的实际值。
  • 给$1添加双引号,避免文件名包含空格时出现解析错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 20:22:09