Bash 脚本不会解释变量中的变量

wf_*_*wf_ 3 bash shell-script variable

我需要提取在配置文件中设置的路径,以在 bash 脚本中使用它。这是该路径在所述文件中的样子:

DIR = "${HOME}/test/tmp"
Run Code Online (Sandbox Code Playgroud)

我需要在不带引号的情况下提取它,这就是我的做法:

TESTVAR="$(cat /home/user/path/to/file.conf | grep ^DIR | grep -o '".*"' | tr -d '"')"
Run Code Online (Sandbox Code Playgroud)

问题是命令不能“正确”解释 ${HOME} 变量。假设我打电话echo $TESTVAR- 结果,而不是这样:

/home/user/test/tmp
Run Code Online (Sandbox Code Playgroud)

我明白了:

${HOME}/test/tmp
Run Code Online (Sandbox Code Playgroud)

所以我不能将它用作脚本中命令的参数!

请问漂亮吗?

ilk*_*chu 10

扩展不会递归应用。这样做将无法处理嵌入美元符号的任意数据。(一个相关的问题是引号和重定向以及其他运算符在扩展后也只是常规字符。)

一个有点常见的习惯是将这样的配置文件作为实际的 shell 脚本,所以(就像 Debian 中的那些/etc/default),所以文件应该是

DIR="${HOME}/test/tmp"
Run Code Online (Sandbox Code Playgroud)

你会读它

. configfile
Run Code Online (Sandbox Code Playgroud)

虽然当然存在文件是完整的shell脚本的问题,但必须符合shell语法并且配置可以运行任意命令。

另一种可能性是通过 运行文件envsubst,例如使用您问题中的文件,envsubst < configfile将输出:

DIR = "/home/me/test/tmp"
Run Code Online (Sandbox Code Playgroud)

或者你可以envsubst '$HOME $OTHER $VARS'用来扩展一些特定的。

请注意,与 shell 脚本不同,envsubst它不会从输入文件中读取任何分配。例如,ROOTPATH第二行中used的值是envsubst从环境中获取的值,它与第一行中的“赋值”无关:

ROOTPATH=/something/$USER
LOGPATH=$ROOTPATH/logs
Run Code Online (Sandbox Code Playgroud)