Shell 在 Jenkins 管道中引用 IFS

Shell quotes with IFS in Jenkins Pipeline

我正在尝试在 Jenkins 管道脚本中的 Bash shell 中设置 IFS。请参阅下面的第 34 行。问题是我无法正确获得多级引用。如果我只是在 bash 终端打字,该行将是 IFS=$'\n'。但是,无论我在不同的组合中使用多少个反斜杠,我都无法让它发挥作用。在这一点上,我只是猜测。

第 36 行末尾的 $filename 变量是一个文件名列表,这些文件名的内部空格由换行符 (\n) 分隔。因此,我希望 IFS 变量仅为 \n.

这是相同的文本片段。

steps {
    sh """
        #!/bin/bash
        export PATH="$PATH:/root/.local/bin"
        IFS=$\'\n\'
        pip install -r requirements.txt --user
        python EC_Workload_Analysis/combine.py --webdav --zipfile ${BUILD_NUMBER} --user $SCRIPT_CREDS_USR --password $SCRIPT_CREDS_PSW $filenames
       """
      }

你能试试吗

export IFS=$(echo -e "\n ")

因为你不能插入你需要的字符,但你可以创建和存储它,你可以做测试

echo "$IFS $IFS $IFS"

感谢 l0b0 的评论!我将第 32 到 36 行放在我的 git 存储库 run_me.sh 中他们自己的脚本中,删除了多余的引号和反斜杠,然后将 bash < run_me.sh 放在第 32 到 36 行的位置。

run_me.sh 看起来像这样:

#!/bin/bash
export PATH="$PATH:/root/.local/bin"
export IFS=$'\n'
pip install -r requirements.txt --user
python EC_Workload_Analysis/combine.py --webdav --zipfile $BUILD_NUMBER --user $SCRIPT_CREDS_USR --password $SCRIPT_CREDS_PSW $filenames

你可以像下面这样写代码片段试试。

steps {
    sh """
        #!/bin/bash
        export PATH="$PATH:/root/.local/bin"
        IFS=$'\n'
        pip install -r requirements.txt --user
        python EC_Workload_Analysis/combine.py --webdav --zipfile ${BUILD_NUMBER} --user $SCRIPT_CREDS_USR --password $SCRIPT_CREDS_PSW $filenames
       """
      }

解释: 在双引号中,$ 被视为特殊字符,因此需要使用 \ 进行转义。 \ 也是一个特殊字符,因此我们也将通过用双斜杠 \.

替换它来转义它

我试过使用虚拟数据,所以请确认它是否符合您的要求。