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
相关产品推荐
相关产品推荐

