【问题标题】:How do I escape a single quote inside single quotes in jenkins-pipeline bash command如何在jenkins-pipeline bash命令中的单引号内转义单引号
【发布时间】:2019-08-12 22:35:04
【问题描述】:

在 jenkins-pipeline 中,我正在尝试使用 SED 将以下行附加到文件末尾。

sh "sed -i '\$ s/\$/ public_file=\\/var\\/lib\\/jenkins\\/workspace\\/test-project\\ ansible_ssh_common_args='-o StrictHostKeyChecking=no'  /' file.txt"

但我不知道如何在我的 Jenkins 文件中转义以下行以使其正常工作。

ansible_ssh_common_args='-o StrictHostKeyChecking=no' 

我已经尝试过以下方法,它适用于 katacoda 游乐场,但不适用于 jenkins 管道。

'"'"'-o StrictHostKeyChecking=no'"'"'  /' file.txt

【问题讨论】:

  • 我对jenkins-pipeline一无所知,但如果你没有使用它,我会建议cat >>yourfile <<'EOF',然后你要附加的行,然后是包含 EOF 的行,作为 100% 有效的解决方案。
  • 也就是说,如果你去掉-o 之后和选项之前的空格,那么你根本不需要引号!也就是说,ansible_ssh_common_args=-oStrictHostKeyChecking=no 应该是完全等价的。
  • 请注意,如果您要查找的模式包含 /,您可以为 sed 使用备用分隔符。例如sed -e 's@/some/path/@/replacement@g。比逃避/ 要干净得多

标签: bash jenkins-pipeline quotes


【解决方案1】:

bash中,单引号内不能转义单引号。

bash manual page

用单引号括起来的字符会保留引号内每个字符的字面值。单引号之间不能出现单引号,即使前面有反斜杠。

您可以使用双引号;然后根据需要逃脱它们。然后,您可以在其中使用单引号而无需进一步转义。

【讨论】:

    【解决方案2】:
    1. 使用"包裹sed命令,然后可以直接在命令中使用'而不用转义。

    2. 使用@,但/作为seds命令的分隔符,那么文件路径中出现的/无需转义,使整个命令更加简洁易读。

    sed -i "\$ s@\$@ public_file=/var/lib/jenkins/workspace/test-project ansible_ssh_common_args='-o StrictHostKeyChecking=no'  @" file.txt
    

    【讨论】:

    • 感谢您提供此代码 sn-p,它可能会提供一些有限的短期帮助。一个正确的解释would greatly improve 它的长期价值通过展示为什么这是一个很好的解决问题的方法,并将使它对未来有其他类似问题的读者更有用。请edit您的回答添加一些解释,包括您所做的假设。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-12
    • 1970-01-01
    • 1970-01-01
    • 2013-12-28
    • 2016-12-17
    • 1970-01-01
    相关资源
    最近更新 更多