Bash 使用GitHub操作在多个文件上循环

Bash 使用GitHub操作在多个文件上循环,bash,pandoc,github-actions,Bash,Pandoc,Github Actions,我的存储库的几个子目录中有多个.md文件。它们都有相同的命名约定,例如seminar1/slides.md,seminar2/slides.md,等等。这些*.md文件需要使用pandoc进行处理。我希望在每次提交到存储库时自动执行此操作,并决定将其作为在Github上运行的操作来实现 我已将以下工作流创建为.yml文件,GitHub将其识别为操作。如果我只有一个子目录,例如,/seminar1/*.md,它就可以工作,但是如果有更多的子目录,它就会失败 name: Make slides o

我的存储库的几个子目录中有多个
.md
文件。它们都有相同的命名约定,例如
seminar1/slides.md
seminar2/slides.md
,等等。这些
*.md
文件需要使用pandoc进行处理。我希望在每次提交到存储库时自动执行此操作,并决定将其作为在Github上运行的操作来实现

我已将以下工作流创建为.yml文件,GitHub将其识别为操作。如果我只有一个子目录,例如,
/seminar1/*.md
,它就可以工作,但是如果有更多的子目录,它就会失败

name: Make slides

on: push

jobs:
  convert_via_pandoc:
    runs-on: ubuntu-18.04
    steps:
      - uses: actions/checkout@v2
        with:
          ref: slides
      - run: |
          echo "::set-env name=FILELIST::$(printf '"%s"' seminar*/*.md)"
      - uses: docker://pandoc/latex:2.9
        with:
          args: -t beamer --output=${{env.FILELIST}}.pdf ${{env.FILELIST}}
      - uses: actions/upload-artifact@v2
        with:
          name: seminar-slides
          path: seminar*/*.md.pdf        
我如何让脚本检测所有
研讨会*/*.md
文件并对其执行操作

另外,我需要一些关于通用性的帮助:

  • 所有脚本都从根目录运行。这意味着我必须修改.md文件的内容以包含目录,例如
    seminar1/bridge.jpg
    ,而不仅仅是包含
    bridge.jpg
    。如何更改每个
    $env.FILELIST
    的工作目录
  • 如何从文件名中删除扩展名并在
    $env.FILELIST
    中使用它

  • 我在谷歌搜索解决方案时遇到了类似的问题(很抱歉为一个老问题添加了一个答案,但我希望后面的人能够更容易地找到这个答案),使用Github操作来迭代

    Github Actions支持在作业中迭代“矩阵”,但它很难使用,而且我无法让它处理字符串中的列表。我找到的唯一可行的解决方案是自己拆分字符串,然后使用bash

    这是我的解决办法。它不使用
    docker://pandoc/latex:2.9
    但更重要的是让概念更清晰

    • 在Github操作中迭代
    您有一个逗号分隔的值字符串,如
    “a,b,c”
    。在每一步中,您都需要将其解析为一个真正的数组,并迭代这些值

    IFS
    代表“内部字段分隔符”。shell使用它来确定如何进行分词,即。E如何识别单词边界。我们使用read命令并将数组作为字符串提供给它。之后,我们只需迭代实际数组

    name: Looping over values in Github Actions
    
    env:
      VALUE_ARRAY_AS_STRING: 'a.md,b.md,c.md'
    
    jobs:
      run-my-stuff:
        name: Iterating over comma-separated-values
        runs-on: ubuntu-latest
        steps:
          - name: Echo values from ENV
              run: |
                IFS="," read -a myarray <<< ${{ env.VALUE_ARRAY_AS_STRING }}
                for i in "${myarray[@]}"; do
                  echo "Value: ${i}"
                  echo "Value: ${i%.*}"
                done
    
          - name: Finding files and store to output
            id: finding-files
            run: |
              echo "::set-output name=FILELIST::$(find . -name '*.md' -print)"
    
          - name: Processing my found files from output
            run: |
              IFS="," read -a myarray <<< ${{ steps.finding-files.outputs.FILELIST }}
              for i in "${myarray[@]}"; do
                file_path=$(dirname "${i}")
                file_name=$(basename "${i}")
                cd file_path
                cat file_name
              done
    
    • 条带化文件扩展名
    从 或

    • 更改工作目录

    如果只运行一个命令,您可以按步骤或使用
    cd
    执行此操作。我没有调查,但我猜
    docker://pandoc/latex:2.9
    也有一个用于工作目录的参数。您需要检查文档。

    谢谢!没有必要为自己的贡献道歉!这里面的脚本都搞糟了。如果不至少更改回原始目录(pushd/popd)或使用子shell使脚本CWD,就不能
    cd
    进入for循环的每个迭代‌ 不能四处走动。但是,即使您修复了这个问题,也无法修复在不同路径中使用GH操作的问题。“有办法,但这不是。”卡莱布,你能提供一个答案吗?
    find . -name '*.md' -print
    
    x="filename.md"
    echo ${x%.*}