Jenkins脚本字符串比较if判断不生效问题解决方法
问题根因
- 本质是混淆了Jenkins Pipeline所用的Groovy语法和Shell语法:Groovy本身不支持Shell风格的反引号命令替换,你写的
def pname = "netstat -ntlp|grep 8080|awk '{printf $7}'|cut -d/ -f2"这行,给pname赋值的是整段命令字符串,根本没有执行命令拿到进程名结果。 - 你看到第二行能打印出
java,是因为带反引号的pname被拼接到echo $pname里传给Shell执行时,Shell识别到字符串里的反引号做了命令替换,先跑了netstat相关命令拿到结果再echo输出——这个输出是Shell层执行的效果,Groovy里的pname变量存的从头到尾都是那串命令文本,和"java"做equals比较自然永远返回false。 - 额外踩坑点:就算用正确方式捕获Shell输出,Jenkins的sh步骤默认返回命令退出码而非输出内容,且捕获到的输出默认末尾带换行符,可能夹杂前后不可见空白,不做处理直接比较也会匹配失败。
正确实现方案
通过Jenkins原生sh步骤捕获命令输出,必须加returnStdout: true参数指定返回标准输出,拿到结果后用trim()清除前后的换行、空格等不可见字符,再做字符串比较:
// 执行命令并捕获输出,命令本身不需要加反引号 def pname = sh( script: "netstat -ntlp|grep 8080|head -n1|awk '{printf \$7}'|cut -d/ -f2", returnStdout: true ).trim() // 调试打印,建议加括号包裹方便识别是否有多余空白 echo "捕获到的8080端口对应进程名:[${pname}]" // 字符串比较 if ("java".equals(pname)) { sh "echo 匹配成功,8080端口对应进程为java" }
补充说明:命令里加
head -n1是为了避免grep匹配到多行结果时捕获到多余内容,如果能确定8080端口只被一个进程占用可以省略。
内容的提问来源于stack exchange,提问作者Andy Xu
相关产品推荐
相关产品推荐

