ato*_*3ls 2 bash command-substitution variable-substitution yaml
给定一个 YAML 文件example.yaml
:
node:
sub_node:
get_this:
Run Code Online (Sandbox Code Playgroud)
我想获得一个包含get_this
使用 Mike Farahyq
和字符串的变量sub_node
yaml="$(cat example.yaml)"
nodename=sub_node
sub_yaml= "$(echo "$yaml" | yq -r '.$nodename' )";
# also tried -> sub_yaml= "$(echo "$yaml" | yq -r '.'"$nodename" )";
Run Code Online (Sandbox Code Playgroud)
请注意,这是一个人为的示例,实际上,该sub_node
字符串事先并不知道,因此我需要替换该$nodename
字符串。
我似乎无法弄清楚如何转义 所需的单引号查询字符串yq
。
我该怎么做?
借助Mike Farah 的yq
nodename
,您可以使用函数从实用程序的环境中访问shell 变量的值,将yq
其作为路径的一部分放入表达式中env()
,如下所示:
$ nodename='sub_node' yq '.node[env(nodename)]' example.yaml
get_this:
Run Code Online (Sandbox Code Playgroud)
node
这将访问由环境变量的值给出的顶级键的子部分nodename
。
这可以避免将 shell 变量的值注入到表达式中yq
,这意味着您可以访问名称中包含点和其他特殊字符的部分。
使用Andrey Kislyuk 的yq
,可以通过通过内部变量传递子密钥来完成类似的操作,如下所示:
$ nodename=sub_node
$ yq -y --arg sect "$nodename" '.node[$sect]' example.yaml
get_this: null
Run Code Online (Sandbox Code Playgroud)
...或者通过读取环境中的值,
$ nodename=sub_node yq -y '.node[$ENV.nodename]' example.yaml
get_this: null
Run Code Online (Sandbox Code Playgroud)