为什么Jenkins遍历sh返回的每行内容时内嵌到sh语句的变量为空
问题根因
这是Groovy字符串插值规则导致的问题:
- Groovy中单引号包裹的字符串属于普通java.lang.String类型,不会做任何变量插值,你写的
sh 'cp -rf /somepath/${it} ...'会把${it}直接作为字符串传给shell执行 - shell环境中没有定义
it变量,所以最终执行的命令里对应位置为空
修复方案
- 把
sh方法参数的单引号替换为双引号,双引号包裹的字符串属于Groovy的GString类型,会自动解析${变量名}完成插值后再传给shell执行 - 对
sh返回的结果调用trim()方法,移除末尾默认携带的换行符,避免循环时出现空行
修正后的完整代码
def var='' // 执行git命令后trim掉首尾空白/换行 var=sh(script: "git diff-tree --no-commit-id --name-only -r somehash | grep 'mypath/'", returnStdout: true).trim() var.eachLine{ line -> // 单引号改双引号,触发Groovy变量插值 sh "cp -rf /somepath/${line} myotherpathintheworkspace" }
额外注意事项
- 如果sh脚本中同时需要Groovy插值变量和shell原生变量,shell变量前要加反斜杠转义,例如:
sh "echo Groovy变量值: ${groovyVar},Shell环境变量值: \$HOME" - 推荐显式声明循环变量名(如上例中的
line),替代默认的it,避免和外层闭包的it变量冲突,代码可读性更高
内容的提问来源于stack exchange,提问作者kol23
相关产品推荐
相关产品推荐

