Jenkins传入参数字符串/数组并遍历执行Docker推送的报错问题
解决Jenkins中Shell脚本数组语法报错问题
问题原因
Jenkins默认使用/bin/sh(POSIX标准Shell)执行脚本,而你用的list=( $IMAGE )是Bash特有的数组定义语法,POSIX sh不支持该语法,因此报Syntax error: "(" unexpected。同时注意Shell变量区分大小写,你脚本里的小写$tag、$repo和参数定义的TAG、REPO不匹配,会导致变量取值为空,这也是潜在问题。
解决方案
方法1:强制使用Bash执行脚本
在Jenkins的Shell步骤开头添加#!/bin/bash,即可使用Bash的数组特性,同时修正变量大小写:
#!/bin/bash list=( $IMAGE ) for n in ${list[@]} do docker tag $n:$TAG $REPO/$n:$TAG docker push $REPO/$n:$TAG done
方法2:无需数组,直接遍历字符串(兼容POSIX sh)
由于IMAGE是空格分隔的字符串,POSIX sh的for循环会自动按空格拆分内容,直接遍历即可,兼容性更强:
for n in $IMAGE do docker tag $n:$TAG $REPO/$n:$TAG docker push $REPO/$n:$TAG done
方法3:严谨拆分字符串(处理特殊场景)
如果镜像名可能包含空格(非常规场景),可以用read结合IFS拆分字符串为数组,同时用双引号包裹变量避免特殊字符解析问题:
#!/bin/bash IFS=' ' read -r -a list <<< "$IMAGE" for n in "${list[@]}" do docker tag "$n:$TAG" "$REPO/$n:$TAG" docker push "$REPO/$n:$TAG" done
内容的提问来源于stack exchange,提问作者JellyHands
相关产品推荐
相关产品推荐

