在Jenkins Pipeline中使用带转义引号的sh命令

时间:2019-07-16 22:00:01

标签: shell awk jenkins-pipeline jenkins-groovy

我正在Jenkins管道中运行shell脚本,我想将由日期创建的最新文件名列打印到文本文件中,我不想打印时间和日期列等,仅9位之后的内容即文件名并打印到txt文件中。

代码如下:

注意:当我在bash中运行这些命令都可以正常工作时,会添加\,因为Jenkins似乎不喜欢没有美元符号的$在shell中都可以正常运行。

放在外壳中的输出是这样的:

 bash.sh
        home
        testfile.txt
        blabla.csv
        rtyuioiuytrty.xml
像上面的

我想在Jenkinsfile中打印。 Jenkins似乎不喜欢运行以下代码:我也尝试过此循环

node ('node') {
    stage ('SSH To server') {
      sshagent(credentials: ['sshkey']) {
        script {
        sh"""ssh -o StrictHostKeyChecking=no user@servername << EOF

      if [ \$? -ne 0 ]; then
                    echo " Error while connecting SSH "
                    exit 1
            fi  

     cd ${SOURCE_PATH}
     if [ \$? -ne 0 ]; then
           echo "Error while doing change directory \${SOURCE_PATH} "
           exit 1
     fi

     ls -lrt | grep "$(date '+%b %e')" |awk '{ s =""; for (i = 9; i <= NF; i++) s = s $i " "; print }'


        exit
        EOF
   """

1 个答案:

答案 0 :(得分:0)

欢迎来到詹金斯逃脱的地狱:-)

以下命令可能会为您提供帮助

node(''){
  sh "touch test.txt"
  sh """ls -lrt | grep \"\$(date '+%b %e')\" |awk '{ s =\"\"; for (i = 9; i <= NF; i++) s = s \$i \" \"; print s }'"""
}

要点是,您必须转义双引号和美元。

更新后的代码段的答案为

 sh"""ssh -o StrictHostKeyChecking=no user@servername << EOF
        if [ \$? -ne 0 ]; then
            echo \" Error while connecting SSH \"
            exit 1
        fi  
        cd \${SOURCE_PATH}
        if [ \$? -ne 0 ]; then
            echo \"Error while doing change directory \${SOURCE_PATH} \"
            exit 1
        fi
        ls -lrt | grep \"\$(date '+%b %e')\" | awk '{ print \\\$9}'
        exit
        EOF
    """