Jenkins部署脚本问题:Version与BuildNumber分支逻辑失效排查
问题排查与修复:Jenkins Shell脚本分支逻辑异常
问题根源
你的脚本里[ -n $Version ]和[ -n $BuildNumber ]的写法存在隐患——当变量未定义或为空时,展开后会变成[ -n ],而test命令(即[ ])会把-n当作非空字符串处理,导致无论变量是否有值,if分支的条件都会判定为真。这就是传入BuildNumber时依然走if分支的核心原因。
修复方案:给变量加双引号
给变量加上双引号,确保空变量展开后是明确的空字符串,test命令才能正确判断:
#!/bin/bash if [ -n "$Version" ]; then echo "Version is present" curl http://localhost:8080/artifactoryservices/artifactory/downloadArtifact/"${Version}" elif [ -n "$BuildNumber" ]; then echo "BuildNumber is Present" curl http://localhost:8080/artifactoryservices/artifactory/downloadArtifact/"${BuildNumber}" else echo "No Version or Build Number found" fi
替代实现方式
方式1:使用Bash扩展测试[[ ]]
Bash的[[ ]]语法更安全,无需担心变量空值展开的问题,写法也更简洁:
#!/bin/bash if [[ -n $Version ]]; then echo "Version is present" curl http://localhost:8080/artifactoryservices/artifactory/downloadArtifact/${Version} elif [[ -n $BuildNumber ]]; then echo "BuildNumber is Present" curl http://localhost:8080/artifactoryservices/artifactory/downloadArtifact/${BuildNumber} else echo "No Version or Build Number found" fi
方式2:严格检查变量存在性(Bash 4.2+)
如果需要区分“变量未定义”和“变量为空字符串”,可以用-v选项检查变量是否存在:
#!/bin/bash if [[ -v Version && -n $Version ]]; then echo "Version is present" curl http://localhost:8080/artifactoryservices/artifactory/downloadArtifact/${Version} elif [[ -v BuildNumber && -n $BuildNumber ]]; then echo "BuildNumber is Present" curl http://localhost:8080/artifactoryservices/artifactory/downloadArtifact/${BuildNumber} else echo "No Version or Build Number found" fi
方式3:合并逻辑简化代码
如果两个curl的URL结构一致,可通过变量替换简化代码:
#!/bin/bash ARTIFACT_ID="" if [ -n "$Version" ]; then ARTIFACT_ID="$Version" elif [ -n "$BuildNumber" ]; then ARTIFACT_ID="$BuildNumber" fi if [ -n "$ARTIFACT_ID" ]; then echo "Using artifact ID: $ARTIFACT_ID" curl http://localhost:8080/artifactoryservices/artifactory/downloadArtifact/"${ARTIFACT_ID}" else echo "No Version or Build Number found" fi
内容的提问来源于stack exchange,提问作者Vishal
相关产品推荐
相关产品推荐

