如何在Jenkins Pipeline Bash命令中转义单引号内的单引号?

3

在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 Playground中有效,但在Jenkins管道中无效。
'"'"'-o StrictHostKeyChecking=no'"'"'  /' file.txt

1
我对jenkins-pipeline一无所知,但如果你没有使用它,我建议使用cat >>yourfile <<'EOF',然后是你想要添加的行,最后加上一个包含EOF的行,这是一种百分之百有效的解决方案。 - Charles Duffy
1
话虽如此,如果你在 -o 和选项之间去掉空格,那么你根本不需要引号!也就是说,ansible_ssh_common_args=-oStrictHostKeyChecking=no 应该完全等效。 - Charles Duffy
请注意,如果您要查找的模式包含 /,则可以为 sed 使用替代分隔符。例如 sed -e 's@/some/path/@/replacement@g。比转义 / 更清晰简洁。 - William Pursell
2个回答

3
  1. 使用"将 sed 命令包裹起来,这样你就可以在命令中直接使用'而不需要进行转义。

  2. 使用@作为 sed 命令的分隔符,而不是/,这样你就不需要对文件路径中出现的/进行转义,从而使整个命令更加简洁易读。

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

感谢您提供这段代码片段,它可能会在短期内提供一些有限的帮助。通过展示为什么这是一个好的解决方案,适当的解释将极大地提高其长期价值,并使其对未来具有类似问题的读者更有用。请编辑您的答案以添加一些解释,包括您所做的假设。 - Toby Speight

3
在中,你无法在单引号内转义单引号。
请参见bash手册页面

将字符括在单引号中会保留引号内每个字符的字面值。即使在反斜杠前面,单引号之间也不得出现单引号。

你可以使用双引号代替单引号;然后根据需要进行转义。然后你可以在其中使用单引号而无需进一步转义。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接