如何在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
相关产品推荐
相关产品推荐

