Shell 在 Jenkins Pipeline 中使用 IFS 引用

问题描述

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

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

enter image description here

这是文本形式的相同片段。

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
       """
      }

说明: 在双引号中,$ 被视为特殊字符,因此需要使用 \ 对其进行转义。 \ 也是一个特殊字符,因此我们也将通过用双斜杠 \\ 替换它来转义它。

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...