在yq中传递Bash变量报错,如何实现动态YAML路径取值?
解决yq中通过Bash动态变量指定YAML路径取值的问题
核心错误分析
- export用法错误:你用了
export $temp,这是把变量的值当作变量名导出,正确写法是导出变量名本身,比如export temp。 - yq表达式语法错误:
.[env($temp)]不符合yq(v4+,mikefarah版本)的语法规范,env()内直接写环境变量名即可,不需要加$;且当变量存储的是完整路径表达式时,无需用.[...]包裹,直接执行表达式就能取值。 - 变量赋值语法错误:循环里的
variable1= echo $variable1 | sed...缺少命令替换的$(...),导致变量赋值失败。
修正后的测试代码
先通过简单测试用例验证:
# 定义完整路径表达式 temp='.configuration.Properties.corporate-url' # 方法1:直接将变量作为yq表达式传入 Value1=$(yq eval "$temp" test.yml) # 方法2:通过环境变量传递给yq(需先导出变量) export temp Value1=$(yq eval 'env(temp)' test.yml) # 输出结果 echo "$Value1"
执行后即可得到预期输出:https://stackoverflow.com/
适配循环场景的完整修正代码
针对你实际的循环逻辑,修正所有错误点:
ApisDraft=$(find drafts/* -maxdepth 1 -type f) for ApiFixOrgsTags in $ApisDraft do # 获取tokenUrl,加引号避免空格解析错误 my_var=$(yq eval '.securityDefinitions.[].tokenUrl' "$ApiFixOrgsTags") # 定义路径前缀 ConfigProper='.configuration.Properties.' CatelogProper='.configuration.catalogs.[].Properties.' # 拼接完整路径表达式 variable1="${ConfigProper}${my_var}" variable2="${CatelogProper}${my_var}" # 清理路径中的空格(修正命令替换语法,加引号) variable1=$(echo "$variable1" | sed -E 's/(\.) */\1/g') variable2=$(echo "$variable2" | sed -E 's/(\.) */\1/g') # 直接传递变量作为yq表达式取值 Value1=$(yq eval "$variable1" "$ApiFixOrgsTags") Value2=$(yq eval "$variable2" "$ApiFixOrgsTags") # 此处可添加对Value1、Value2的处理逻辑 echo "文件: $ApiFixOrgsTags" echo "Value1: $Value1" echo "Value2: $Value2" done
关键修正点说明
- 变量赋值规范:用
$(command)做命令替换,给变量和命令参数加双引号,避免空格或特殊字符导致的解析异常。 - yq表达式传递:直接将Bash变量以字符串形式传入yq(用双引号包裹
"$variable1"),yq会自动将其当作合法路径表达式执行,这是实现动态路径取值最简洁的方式。 - 避免不必要的export:如果不需要通过yq的
env()函数引用变量,无需执行export,直接传递字符串更高效;若一定要用env方式,需先执行export variable1,再用yq eval 'env(variable1)' "$ApiFixOrgsTags"取值。
内容的提问来源于stack exchange,提问作者Dhaval Patel
相关产品推荐
相关产品推荐

