给定一个 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
,您可以使用该函数从实用程序的环境中访问nodename
shell 变量的值,将其作为路径的一部分放入表达式中,如下所示:yq
strenv()
$ 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: