如何从 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 中读取特定数据(作为键值)。如果有人帮助我解决这个问题,那将非常有帮助。提前致谢!!!
这是 yq 的示例。以下所有内容均假定值不包含换行符。
给定
$ 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
我有一个 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 中读取特定数据(作为键值)。如果有人帮助我解决这个问题,那将非常有帮助。提前致谢!!!
这是 yq 的示例。以下所有内容均假定值不包含换行符。
给定
$ 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