如何完全解析 bash/shell 脚本中的环境变量 [重复]

Posted

技术标签:

【中文标题】如何完全解析 bash/shell 脚本中的环境变量 [重复]【英文标题】:How do I fully resolve the environment variables in bash/shell scripting [duplicate] 【发布时间】:2020-08-04 21:42:56 【问题描述】:

这是场景:

系统预设有以下环境变量

INNER1=1
INNER2=2
INNER3=3

现在我有了文件:values.properties

OUTER1=$INNER1
OUTER2=$INNER2
OUTER3=$INNER3

我还有一个名为:run.sh

的shell脚本
#!/bin/sh

PROPERTIES_FILE=values.properties

while IFS== read -r VAR1 VAR2
do
    export $VAR1=$VAR2
done < $PROPERTIES_FILE

现在的问题是,当我运行脚本时,会导出以下内容:

OUTER1=$INNER1
OUTER2=$INNER2
OUTER3=$INNER3

但期望的结果应该是:

OUTER1=1
OUTER2=2
OUTER3=3

我希望它在导出时完全解析变量名。

【问题讨论】:

为什么要把事情复杂化?只需. values.properties 如何运行该脚本?或者你在哪里使用导出的变量? 有关 bash 中间接扩展的广泛讨论,请参阅BashFAQ #6。也就是说,如果您相信您的数据是有效代码,我同意 Joseph 的观点,即您应该将其作为代码显式 运行(使用 . 运算符,在 bash 中也以 @987654329 为别名@)。 @CharlesDuffy :虽然 OP 将其标记为 bash,但该脚本很可能不会作为 bash 脚本执行。不幸的是,OP 没有告诉我们他是如何运行脚本的,但假设他只是通过输入路径来运行它,它是由sh 运行的。 @user1934428,BashFAQ 还涵盖了 POSIX sh 和 ksh。 【参考方案1】:

您需要使用shell parameter expansion。 #!/bin/sh

PROPERTIES_FILE=values.properties

while IFS== read -r VAR1 VAR2
do
  export $VAR1="$!VAR2"
done < $PROPERTIES_FILE

您可能还需要将 values.properties 文件更改为:

OUTER1=INNER1
OUTER2=INNER2
OUTER3=INNER3

我希望这会有所帮助!

【讨论】:

在How to Answer 中,请参阅回答正确提出的问题 部分,以及其中关于“之前已经被多次询问和回答”的问题的要点。回答重复意味着人们不太可能在问题的规范实例上看到更完整和经过广泛审查的答案集。 (当然,如果已经存在的实例缺少某些内容,您应该感到鼓励在规范实例上添加新答案!)

以上是关于如何完全解析 bash/shell 脚本中的环境变量 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Linux操作系统基础解析之——Bash(Shell)基础知识

如何在 bash shell 脚本中的 perl 命令调用中使用 shell 变量?

Bash shell:如何从变量值重新格式化字符串日期

如何在bash shell脚本中使用expect

Linux Shell——bash shell 脚本简介

bash shell和进程