如何插入表示环境变量的字符串

How to interpolate strings that represent environment variables

我知道 runtime 需要替换纯文本文件中的环境变量。假设文件如下所示:

version: v1
kind: Pod
metadata:
  - name: $PODNAME

我的 bash 脚本提取所有环境变量,这里是 $PODNAME

一旦我掌握了哪些字符串标记是环境变量,我想将它们替换为主机 运行 脚本中的环境变量值。所以在上面,我将字符串 $PODNAME 替换为 $PODNAMEenv 值。

凭借我所拥有的,我可以列出所有 env 变量。但我似乎无法完成更换。对于我的玩具示例,我想输出字符串标记和它应该替换的值:

    #!/bin/bash
    IFS=', ' read -a array <<< $(grep -F -- "$" file.yaml | sed -e 's/          value: //' | tr '\n' ' ')
    for element in "${array[@]}"
    do
        echo "$element"
    done

我试过这样的东西:

        echo "$element ${$element}"

我做了一些搜索,但似乎找不到 Whosebug 已经涵盖了这个奇怪 usecase 的问题。

使用 here document:

PODNAME="foo"

cat << EOF
version: v1
kind: Pod
metadata:
  - name: $PODNAME
EOF

输出:

version: v1
kind: Pod
metadata:
  - name: foo

如果你有gnu sed,可以用sede动作完成。

$ export PODNAME=foo

$ cat file.yaml 
version: v1
kind: Pod
metadata:
  - name: $PODNAME

$ sed -r 's/^(.*) ($[A-Z]+)/echo " "/e' file.yaml
version: v1
kind: Pod
metadata:
  - name: foo

需要导出环境变量,sed 才能看到它的值。

Heredoc 本来是个好方法,但与我尝试做的不一致:

I'd like to echo out both the string token and the value it should replace

我在这方面走在了正确的轨道上:

echo "$element ${$element}"

最后,这是有效的:

EL=$(echo "$element" | sed 's/$//')
echo "$element ${!EL}"

所有人都投赞成票,无论如何。