Jenkinsfile中Bash命令美元符号后非法字符报错求助
问题分析与解决
错误原因
你的Jenkins流水线代码使用了双引号字符串,Groovy会自动解析双引号内$开头的表达式。代码里的$?被Groovy误认为是Groovy变量插值语法,但该写法不符合Groovy插值规则(正确格式应为${变量名}),而你实际希望$?作为shell特殊变量(表示上一条命令的退出码)执行,因此触发语法错误。
解决方法
有两种可行的修改方式:
方式1:用单引号包裹shell脚本
Groovy的单引号字符串不会进行变量插值,$?会原封不动传递给shell执行:
def CheckChartDir = sh (script: 'git rev-parse remotes/origin/${env.ghprbTargetBranch}:chart &> /dev/null ; echo $?', returnStdout: true).trim()
注:${env.ghprbTargetBranch}仍能被Jenkins流水线正常解析,因为它是shell脚本内部的shell变量插值(Jenkins环境变量会被shell自动识别)。
方式2:转义shell中的$符号
在双引号字符串里,用\$转义$?,让Groovy将其视为普通字符传递给shell:
def CheckChartDir = sh (script: "git rev-parse remotes/origin/${env.ghprbTargetBranch}:chart &> /dev/null ; echo \$?", returnStdout: true).trim()
这种方式下,${env.ghprbTargetBranch}依然会被Groovy正常插值为Jenkins环境变量的值,\$?则会被转义成$?传给shell。
验证说明
修改后,shell会正确执行git rev-parse命令,通过echo $?返回上一条命令的退出码(0表示目标分支的chart目录存在,非0表示不存在),最终CheckChartDir变量会拿到该退出码的字符串值。
内容的提问来源于stack exchange,提问作者Ahmed Nageh
相关产品推荐
相关产品推荐

