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

GitHub Actions 如何设置step输出多值实现后续步骤遍历文件名

问题根因

你当前的写法每次循环都调用set-output给f赋值,新值会直接覆盖旧值,因此最终steps.test1.outputs.f只会保留最后一次赋值的文件名。

解决方案

有两种常用的实现方式,可根据场景选择:

方式1:分隔符拼接字符串(最简单,适配大多数场景)

将所有文件名用换行符/空格拼接后,一次性设置为step输出,后续遍历即可:

- name: Test1
  id: test1
  run: |
    # 收集所有文件,用换行分隔,适配含空格的文件名
    files=""
    for f in $(ls $GITHUB_WORKSPACE/.github/workflows); do
      echo "file: $f"
      files="$files"$'\n'"$f"
    done
    # 去掉开头多余的换行,写入输出(注:新版GitHub Actions推荐用GITHUB_OUTPUT,旧的::set-output已弃用)
    files="${files:1}"
    echo "f<<EOF" >> $GITHUB_OUTPUT
    echo "$files" >> $GITHUB_OUTPUT
    echo "EOF" >> $GITHUB_OUTPUT

- name: Test2
  run: |
    # 按换行分割遍历文件名
    IFS=$'\n'
    for file in ${{ steps.test1.outputs.f }}; do
      echo "$file detected"
    done

如果确认所有文件名都不包含空格,也可以直接用空格作为分隔符,无需修改IFS。

方式2:输出JSON数组(结构化场景推荐)

如果后续需要对文件列表做更复杂的处理,可以输出标准JSON数组,配合jq操作:

- name: Test1
  id: test1
  run: |
    # 把ls结果转成JSON数组
    files=$(ls $GITHUB_WORKSPACE/.github/workflows | jq -R -s -c 'split("\n")[:-1]')
    echo "f=$files" >> $GITHUB_OUTPUT

- name: Test2
  run: |
    # 解析JSON数组遍历
    for file in $(echo '${{ steps.test1.outputs.f }}' | jq -r '.[]'); do
      echo "$file detected"
    done

内容的提问来源于stack exchange,提问作者ivan.ukr

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:39:03