使用yq的env运算符访问YAML嵌套路径时出现报错的问题咨询
解决yq使用env运算符访问嵌套YAML路径的错误问题
先来看你的YAML文件内容:
shop: europe: germany: shopA: shopBAddress asia: thailand: shopB: address: shopBAddress
你尝试用环境变量动态访问shop.europe.germany路径,但两次命令都出错了,我来帮你分析问题所在:
第一个命令的错误原因
你执行的第一条命令:
location=europe country=germany yq e '.shop.[env(location)].[env(country)]' example.yaml
报错Error: Bad expression, please check expression syntax,问题出在点号和方括号之间多了多余的点。yq的语法规则里,访问对象属性时,要么用.属性名的写法,要么用["属性名"]/[变量]的写法,不能把两种写法错误混合成..[变量]。这里的.shop.[env(...)]是不符合语法的,所以直接触发表达式语法错误。
第二个命令的错误原因
第二条命令:
location=europe country=germany yq e '.shop.[env(location)][env(country)]' example.yaml
报错Error: Cannot index array with 'germany' (strconv.ParseInt: parsing "germany": invalid syntax),问题还是出在shop后面的多余点上。.shop.[env(location)]这种写法会让yq错误地认为你要对shop这个对象进行数组遍历操作(类似.shop[]遍历所有子元素),但env(location)返回的是字符串europe,yq会尝试把这个字符串转换成整数来索引数组,自然就失败了。
正确的命令写法
只需要去掉所有多余的点,直接用方括号包裹环境变量即可:
location=europe country=germany yq e '.shop[env(location)][env(country)]' example.yaml
执行这条命令后,就能正确返回shopA: shopBAddress对应的内容啦。
内容的提问来源于stack exchange,提问作者Matikk
相关产品推荐
相关产品推荐

