如何从 shell 脚本中的 yaml 文件中读取特定数据

How to read a specific data from a yaml file inside a shell script

我有一个 yaml 文件说“test.yaml”。下面是yaml文件的内容。

...
test:
  config:
    abc: name1
    xyz: name2
...

现在我想从 shell 脚本中的 yaml 中单独读取 abc 和 xyz 的值,并将其存储在 shell 脚本中的两个变量中。 test.yaml 文件包含除上述数据之外的其他数据,我不需要为这个 shell 脚本中的数据操心。

例如:test.sh

var1=name1 //test[config[abc]]
var2=name2 //test[config[xyz]]

如何从 shell 脚本中的 yaml 中读取特定数据(作为键值)。如果有人帮助我解决这个问题,那将非常有帮助。提前致谢!!!

这是 的示例。以下所有内容均假定值不包含换行符。

给定

$ cat test.yaml
---
test:
  config:
    abc: name1
    xyz: name2

然后

yq e '.test.config | to_entries | map(.value) | .[]' test.yaml

产出

name1
name2

您可以将它们读入变量,例如

{ read -r var1; read -r var2; } < <(yq e '.test.config | to_entries | map(.value) | .[]' test.yaml)
declare -p var1 var2
declare -- var1="name1"
declare -- var2="name2"

虽然我会使用 yaml 键将它们读入关联数组:

declare -A conf
while IFS="=" read -r key value; do conf["$key"]=$value; done < <(
    yq e '.test.config | to_entries | map([.key, .value] | join("=")) | .[]' test.yaml
)
declare -p conf
declare -A conf=([abc]="name1" [xyz]="name2" )

那你可以写

echo "test config for abc is ${conf[abc]}"
# or
for var in "${!conf[@]}"; do printf "key %s, value %s\n" "$var" "${conf[$var]}"; done

我正在使用“Go 实现”

$ yq --version
yq (https://github.com/mikefarah/yq/) version 4.16.1