Bash 变量替换为 yq 命令

Bash 变量替换为 yq 命令

给定一个 YAML 文件example.yaml

node:
  sub_node:
    get_this:

我想获得一个包含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" )";

请注意,这是一个人为的示例,实际上,该sub_node字符串事先并不知道,因此我需要替换该$nodename字符串。

我似乎无法弄清楚如何转义 所需的单引号查询字符串yq

我该怎么做?

答案1

迈克·法拉赫yq,您可以使用该函数从实用程序的环境中访问nodenameshell 变量的值,将其作为路径的一部分放入表达式中,如下所示:yqstrenv()

$ nodename='sub_node' yq '.node[strenv(nodename)]' example.yaml
get_this:

node这将访问由环境变量的值给出的顶级键的子部分nodename

避免将 shell 变量的值注入到yq表达式中,这意味着您可以访问名称中包含点和其他特殊字符的部分。


使用安德烈·基斯柳克yq,可以通过通过内部变量传递子键来完成类似的事情,如下所示:

$ nodename=sub_node
$ yq -y --arg sect "$nodename" '.node[$sect]' example.yaml
get_this: null

...或者通过读取环境中的值,

$ nodename=sub_node yq -y '.node[$ENV.nodename]' example.yaml
get_this: null

答案2

正如 ikkachu 的评论中所述,我应该使用双引号。

具有讽刺意味的是,事实证明,由于我之后的空间,我的尝试和错误努力都没有奏效=

我还必须更正上面示例的查找字符串:

nodename=node.sub_node
sub_yaml="$(echo "$yaml" | yq -r ".$nodename" )";
echo $sub_yaml
get_this:

相关内容