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
相关产品推荐
相关产品推荐

