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

如何用yq在bash脚本中构建YAML列表?

解决bash脚本中用yq构建YAML数组的问题

一、修复labels数组的构建问题

你当前的循环会每次迭代都完整处理一次模板文件,所以输出两份独立结果。要一次性把bash数组转成YAML的labels列表,直接用yq的参数传递功能即可,无需循环:

方法1:结合jq传递JSON数组(推荐)

如果系统有jq工具,可以把bash数组转成标准JSON数组,再通过--argjson传给yq:

# 定义bash数组
labels=("project" "group")

# 转换数组为JSON格式,传递给yq并替换labels字段
yq '.labels = $labels' \
  --argjson labels "$(printf '%s\n' "${labels[@]}" | jq -R . | jq -s .)" \
  metric-spec-template.yaml

方法2:纯yq实现(无需jq)

如果不想依赖jq,可以用bash的IFS把数组拼接成逗号分隔的字符串,再用yq的split方法转成数组:

labels=("project" "group")
# 拼接为逗号分隔的字符串
labels_csv=$(IFS=,; echo "${labels[*]}")

# 替换labels字段
yq '.labels = split(",")' --arg labels "$labels_csv" metric-spec-template.yaml

两种方法都会输出正确的labels: [project, group]。

二、构建data对象列表

假设你有一组bash变量或数组存储data条目,比如:

# 定义多个data条目,每个条目用空格分隔字段
data_entries=(
  "value1 sum [label1,label2]"
  "value2 avg [label3]"
)

可以通过循环+yq eval-all来逐个添加到data数组:

# 先复制模板到临时文件(避免修改原模板)
cp metric-spec-template.yaml temp.yaml

# 循环添加data条目
for entry in "${data_entries[@]}"; do
  # 拆分条目字段
  read -r value operation label_values <<< "$entry"
  # 把label_values字符串转成YAML数组并追加到data
  yq eval-all 'select(fileIndex == 0) * select(fileIndex == 1) | .data += [{"value": $value, "operation": $operation, "labelValues": $label_values}]' \
    temp.yaml \
    --arg value "$value" \
    --arg operation "$operation" \
    --argjson label_values "$(echo "$label_values" | yq -o json)" \
    > temp_new.yaml
  mv temp_new.yaml temp.yaml
done

# 最终结果在temp.yaml
cat temp.yaml

如果是动态生成单个data条目,也可以直接用yq '.data += [{"value": "...", "operation": "...", "labelValues": ["..."]}]'来追加。

三、yq核心使用要点(针对YAML数组/对象操作)

  • 替换数组:直接赋值数组,比如.labels = ["a", "b"]
  • 追加数组元素:.labels += ["c"]
  • 修改数组元素:.labels[0] = "new_val"
  • 构建对象列表:用.data += [{"key": "val"}, ...]追加对象到列表
  • 批量传递参数:用--arg传字符串,--argjson传JSON格式的数组/对象,避免bash变量插值的引号问题
  • 多文件合并/修改:用eval-all结合fileIndex处理多个输入文件

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 09:00:00