Jenkins 管道中的变量替换对于具有多个变量的表达式失败

问题描述 投票:0回答:1

在 shell 块中使用 Jenkins 环境变量的分配时,我注意到如果我替换字符串中的多个变量,或者存在

_
,则它不起作用。例如,这有效

script {
    def formattedDate = sh(script: "date +'%Y-%m-%d %H:%M:%S'", returnStdout: true).trim()
    sh """
        mkdir customization
        mkdir customization/nemo
        mkdir customization/memo
        mkdir customization/pemo
        
        echo "BuildNum=${currentBuild.number}" > DevOpsReleaseInfo.properties
        echo "ReleaseNum=${VERSION}" >> DevOpsReleaseInfo.properties
        echo "DevOpsReleaseNum=${VERSION}" >> DevOpsReleaseInfo.properties
        echo "BuildTime=$formattedDate" >> DevOpsReleaseInfo.properties

        version="${env.VERSION}"
        build_num="${currentBuild.number}"
        for dir in customization/*; do   
            [ -f \$dir ] && continue
            customer=\$(basename \$dir)
            mkdir customization/\$customer/\$version-db-\$build_num
        done
    """
}

我得到了输出

+ version=6.12.0-SNAPSHOT
+ build_num=28
+ '[' -f customization/memo ]
+ basename customization/memo
+ customer=memo
+ mkdir customization/memo/6.12.0-SNAPSHOT-db-28
+ '[' -f customization/nemo ]
+ basename customization/nemo
+ customer=nemo
+ mkdir customization/nemo/6.12.0-SNAPSHOT-db-28
+ '[' -f customization/pemo ]
+ basename customization/pemo
+ customer=pemo
+ mkdir customization/pemo/6.12.0-SNAPSHOT-db-28 

但这不是

script {
    def formattedDate = sh(script: "date +'%Y-%m-%d %H:%M:%S'", returnStdout: true).trim()
    sh """
        mkdir customization
        mkdir customization/nemo
        mkdir customization/memo
        mkdir customization/pemo
        
        echo "BuildNum=${currentBuild.number}" > DevOpsReleaseInfo.properties
        echo "ReleaseNum=${VERSION}" >> DevOpsReleaseInfo.properties
        echo "DevOpsReleaseNum=${VERSION}" >> DevOpsReleaseInfo.properties
        echo "BuildTime=$formattedDate" >> DevOpsReleaseInfo.properties

        version="${env.VERSION}"
        build_num="${currentBuild.number}"
        for dir in customization/*; do   
            [ -f \$dir ] && continue
            customer=\$(basename \$dir)
            mkdir customization/\$customer/\$version_db_\$build_num
        done
    """
}

请注意,我使用的是

\$version_db_\$build_num
而不是
\$version-db-\$build_num

+ version=6.12.0-SNAPSHOT
+ build_num=29
+ '[' -f customization/memo ]
+ basename customization/memo
+ customer=memo
+ mkdir customization/memo/29
+ '[' -f customization/nemo ]
+ basename customization/nemo
+ customer=nemo
+ mkdir customization/nemo/29
+ '[' -f customization/pemo ]
+ basename customization/pemo
+ customer=pemo
+ mkdir customization/pemo/29
jenkins jenkins-pipeline jenkins-groovy jenkins-job-dsl
1个回答
0
投票

您的问题与 Jenkins 无关,这是一个简单的 bash 重现:

foo=1; echo $foo-x # prints 1-x
foo=1; echo $foo_x # prints nothing

虽然

-
不是变量名称中的有效字符,但
_
是。因此,在没有其他线索的情况下,bash 将它们视为
$foo
$foo_x
变量,而后者是未定义的。如果变量名称不明确,请在变量名称周围加上
{}

参见 bash 参数扩展

要扩展的参数名称或符号可以用大括号括起来,大括号是可选的,但用于保护要扩展的变量免受紧随其后的字符的影响,这些字符可能被解释为名称的一部分。

© www.soinside.com 2019 - 2024. All rights reserved.