给定一个如下所示的 yaml 配置文件:
key1:
key11: value1
key12: value2
key2:
key21: value3
如何将 bash 脚本(最好使用 yq)中的它转换为以字符串为前缀的环境变量?
env
所需的输出:
TF_VAR_key11=value1
TF_VAR_key12=value2
TF_VAR_key21=value3
假设输入的子元素中 key 和 value 之间缺少空格是故意的,所以我们只是处理包含
:
的字符串值数组,并用空格分隔。
yq '.[] | split(" ") | .[] | split(":") | "TF_VAR_" + .[0] + "=" + .[1]' file.yaml
您使用的是 yq
的哪种实现?这适用于 mikefarah/yq。要与 kislyuk/yq 一起使用,请添加
-r
选项。
如果您在 Bash 中编写脚本,则可以将 yq 和 jq 与导出命令一起使用:
#!/bin/bash
# Read the YAML file and convert it to JSON using 'yq' and 'jq' tools
json=$(yq eval '. | tojson' input.yaml)
# Set each key-value pair as an environment variable
while IFS== read -r key value; do
export "$key"="$value"
done < <(echo "$json" | jq -r 'to_entries[] | "\(.key)=\(.value)"')
# To check the env vars
printenv
您首先将 YAML 配置加载到内存中。
from yaml import loads
with open("config.yaml") as f:
config = loads(f.read())
然后,迭代字典值,它们看起来也是字典。对于每个字典,将 key=val 对写入新文件。
env_str = ""
for inner_dict in config.values():
for key, val in inner_dict.items():
env_str = f"TF_VAR_{key}={val}\n"
按照建议使用 python 是简单易读的,如果你需要在 bash 中完成所有操作,你可以检查这个线程,它有各种解决方案:
如何从 Linux shell 脚本解析 YAML 文件?