如何使用yq结合Bash变量检测YAML数组中元素是否存在
解决方法
你的问题出在Bash变量的展开规则:用单引号包裹yq表达式时,Bash不会解析里面的$WORD变量,yq实际在查找字符串"$WORD"而非变量值bravo,所以返回false。
下面是两种可行的解决方式:
方式一:拆分引号让Bash展开变量
通过混合单双引号,让Bash正确解析$WORD,再传递给yq:
yq 'contains(["'"$WORD"'"])' test.yaml
原理:'"$WORD"'的写法是先关闭单引号,用双引号包裹变量触发Bash展开,再重新打开单引号拼接完整表达式,最终yq收到的是contains(["bravo"])。
方式二:用yq的环境变量引用功能
Mike Farah版本的yq支持env()函数直接读取环境变量,步骤如下:
- 先把Bash变量导出为环境变量(或临时设置)
- 在yq表达式里调用
env(WORD)获取变量值
示例命令:
# 临时设置环境变量并执行yq WORD="$WORD" yq 'contains([env(WORD)])' test.yaml
或者提前导出变量:
export WORD yq 'contains([env(WORD)])' test.yaml
两种方式都会返回true,因为目标数组确实包含bravo。
内容的提问来源于stack exchange,提问作者wwillfred
相关产品推荐
相关产品推荐

