【问题标题】:Shell quotes with IFS in Jenkins Pipeline詹金斯管道中带有 IFS 的壳牌报价
【发布时间】:2021-05-28 11:06:30
【问题描述】:

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

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

这是文本形式的相同sn-p。

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

【问题讨论】:

  • 我强烈建议将该代码放入脚本中。试图维护用另一种语言编写的重要代码总是一件很痛苦的事情。

标签: bash jenkins backslash quote ifs


【解决方案1】:

你可以试试

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

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

echo "$IFS $IFS $IFS"

【讨论】:

    【解决方案2】:

    感谢 l0b0 的评论!我将第 32 到 36 行放在自己的 git repo 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
    

    【讨论】:

      【解决方案3】:

      你可以编写如下代码 sn-p 并尝试。

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

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

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

      【讨论】:

        最近更新 更多