You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用yq遍历数组时使用变量出现异常行为的问题排查

在yq中正确使用变量遍历数组的方法

问题场景

现有test.yaml文件内容:

- name: Cathy
  has: apples
- name: Bob
  has: bananas

执行以下yq命令时,得到不符合预期的重复输出(共4条结果,预期仅2条):

yq '.[] | .name as $n | {"n": $n}' test.yaml

输出结果:

n: Cathy
n: Bob
n: Cathy
n: Bob

但仅输出变量的命令结果正常:

yq '.[] | .name as $n | $n' test.yaml

输出:

Cathy
Bob

对比jq中类似命令可得到符合预期的2条结果:

echo '{"list": [{"name": "Cathy", "has": "apples"}, {"name": "Bob", "has": "bananas"}]}' | jq '.list[] | .name as $n | {"n": $n}'

输出:

{
  "n": "Cathy"
}
{
  "n": "Bob"
}

解决方案

yq(此处指mikefarah/yq)的管道处理逻辑与jq存在差异,直接串联数组展开、变量绑定和对象构造会触发重复遍历。以下是三种正确的实现方式:

方法1:用括号分组操作

将变量绑定与对象构造的逻辑分组,确保每个数组元素仅执行一次对象构造:

yq '.[] | (.name as $n | {"n": $n})' test.yaml

方法2:使用map函数处理数组

map函数会遍历数组的每个元素并执行指定操作,更贴合数组遍历的语义:

yq 'map(.name as $n | {"n": $n})' test.yaml

方法3:直接构造对象(无需显式变量)

如果不需要显式使用变量,直接通过字段引用构造对象更简洁:

yq 'map({"n": .name})' test.yaml

以上三种方法的输出均符合预期:

n: Cathy
n: Bob

内容的提问来源于stack exchange,提问作者klimenkov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.30 14:48:24