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

为什么Jenkins遍历sh返回的每行内容时内嵌到sh语句的变量为空

问题根因

这是Groovy字符串插值规则导致的问题:

  • Groovy中单引号包裹的字符串属于普通java.lang.String类型,不会做任何变量插值,你写的sh 'cp -rf /somepath/${it} ...'会把${it}直接作为字符串传给shell执行
  • shell环境中没有定义it变量,所以最终执行的命令里对应位置为空
修复方案
  1. 把sh方法参数的单引号替换为双引号,双引号包裹的字符串属于Groovy的GString类型,会自动解析${变量名}完成插值后再传给shell执行
  2. 对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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 18:06:02