You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins从Shell调用参数值报错,寻求无IF的动态取值方案

Jenkins Shell脚本中正确调用构建参数的方法

问题背景

在Jenkinsfile的Shell脚本中尝试直接调用${params.prime_server}这类构建参数时,出现错误:line 4: ${params.prime_server}: bad substitution,需要不通过IF逐个判断的方式,直接获取选中的参数值并在Shell中使用。

错误原因

你使用了Groovy的原生单引号字符串('''),这种字符串不会解析其中的Groovy变量,导致Shell把${params.prime_server}当成自身的变量语法处理。但Shell不支持这种带点的变量命名规则,因此触发语法错误。

解决方案

以下三种常用方式可解决该问题,任选其一即可:

方法一:使用Groovy双引号字符串解析参数

将Shell脚本的包裹符从'''改为""",让Groovy提前将${params.xxx}替换为实际参数值后,再传递给Shell执行。注意Shell自身的变量需要加转义符\,避免被Groovy误解析:

#!/usr/bin/env groovy

properties([
    parameters([
        choice(
            name: 'prime_server',
            choices: ['','choice1', 'choice2', 'choice3','choice4'],
            description: 'Name choice'
        ),
        choice(
            name: 'old_server',
            choices: ['','choice1', 'choice2', 'choice3','choice4'],
            description: 'Name choice'
        )
    ])
]) 

stage('stage1') {
    node("master") {
        sh """
            echo -e "-------------------------------Calling the params value into shell----------------------------"
            echo  "${params.prime_server}"
            echo  "${params.old_server}"
            oldserver="${params.old_server}"
            primeserver="${params.prime_server}"
            echo  "\${oldserver}"
            echo  "\${primeserver}"

            sed -i -e "0,/\${oldserver}/ s/\${oldserver}/\${primeserver}/g" test.xml
        """.stripIndent()
    }
}

方法二:通过环境变量传递参数

在Jenkins的environment块中,将构建参数映射为环境变量,Shell脚本直接引用环境变量名即可。这种方式更符合Shell的使用惯例,也更安全:

#!/usr/bin/env groovy

properties([
    parameters([
        choice(
            name: 'prime_server',
            choices: ['','choice1', 'choice2', 'choice3','choice4'],
            description: 'Name choice'
        ),
        choice(
            name: 'old_server',
            choices: ['','choice1', 'choice2', 'choice3','choice4'],
            description: 'Name choice'
        )
    ])
]) 

stage('stage1') {
    environment {
        PRIME_SERVER = params.prime_server
        OLD_SERVER = params.old_server
    }
    node("master") {
        sh '''
            echo -e "-------------------------------Calling the params value into shell----------------------------"
            echo  "${PRIME_SERVER}"
            echo  "${OLD_SERVER}"
            oldserver="${OLD_SERVER}"
            primeserver="${PRIME_SERVER}"
            echo  "${oldserver}"
            echo  "${primeserver}"

            sed -i -e "0,/${oldserver}/ s/${oldserver}/${primeserver}/g" test.xml
        '''.stripIndent()
    }
}

方法三:Groovy变量插值注入Shell脚本

先将构建参数赋值给Groovy变量,再通过字符串拼接的方式将变量注入Shell脚本:

#!/usr/bin/env groovy

properties([
    parameters([
        choice(
            name: 'prime_server',
            choices: ['','choice1', 'choice2', 'choice3','choice4'],
            description: 'Name choice'
        ),
        choice(
            name: 'old_server',
            choices: ['','choice1', 'choice2', 'choice3','choice4'],
            description: 'Name choice'
        )
    ])
]) 

stage('stage1') {
    node("master") {
        def primeServer = params.prime_server
        def oldServer = params.old_server
        sh '''
            echo -e "-------------------------------Calling the params value into shell----------------------------"
            echo  "' + primeServer + '"
            echo  "' + oldServer + '"
            oldserver="' + oldServer + '"
            primeserver="' + primeServer + '"
            echo  "${oldserver}"
            echo  "${primeserver}"

            sed -i -e "0,/${oldserver}/ s/${oldserver}/${primeserver}/g" test.xml
        '''.stripIndent()
    }
}

额外提示

如果参数值包含空格、引号等特殊字符,优先选择方法二,通过环境变量传递能避免转义错误,提升脚本稳定性。

内容的提问来源于stack exchange,提问作者user5820327

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 17:09:25