Jenkins CI/CD中Groovy向Bash传递数组丢失值的解决方法
问题解决:Jenkins Groovy传数组到Bash脚本仅获第一个值
问题原因
你当前的Groovy代码拼接数组后导出环境变量时未加引号,导致Bash解析命令时出现错误:
Groovy生成的实际Bash命令是:
export MY_USERS=user1 user2 user3
Bash会将其解析为把MY_USERS赋值为user1,然后将user2、user3当作独立命令执行,因此SCRIPT_USERS只能拿到第一个值。
解决方案
方案1:给环境变量值加引号(最简单的修改)
修改Groovy代码,在拼接后的用户列表外层添加单引号,确保Bash将整个字符串视为一个变量值:
def users = ["user1","user2","user3"] sh """ export MY_USERS='${users.join(' ')}' ./start.sh """
对应的start.sh代码保持遍历逻辑,同时给变量加引号避免用户名称含空格的情况:
SCRIPT_USERS="$MY_USERS" for user in $SCRIPT_USERS; do $PARAMS $K6 run "$user.js" -o xk6-influxdb \ --out "web-dashboard=port=0&report=$DIR/${user}.html" & done
方案2:传递Bash格式的数组(更规范)
如果需要严格按数组处理,可在Groovy中直接生成Bash数组格式的变量:
def users = ["user1","user2","user3"] sh """ # 将Groovy数组转为Bash数组,每个元素加单引号避免空格问题 export MY_USERS=(${users.collect { "'$it'" }.join(' ')}) ./start.sh """
然后在start.sh中用Bash数组的遍历方式,确保每个元素被正确识别:
# 遍历Bash数组 for user in "${MY_USERS[@]}"; do # 移除eval,直接执行命令,减少安全风险 $PARAMS $K6 run "$user.js" -o xk6-influxdb \ --out "web-dashboard=port=0&report=$DIR/${user}.html" & done
方案3:直接传递位置参数(最可靠)
跳过环境变量,直接将用户列表作为命令行参数传给start.sh,避免环境变量的解析问题:
Groovy代码修改:
def users = ["user1","user2","user3"] # 将数组元素作为参数传给start.sh sh "./start.sh ${users.join(' ')}"
start.sh中直接使用位置参数$@遍历:
# $@代表所有传入的命令行参数,加引号确保每个元素独立 for user in "$@"; do $PARAMS $K6 run "$user.js" -o xk6-influxdb \ --out "web-dashboard=port=0&report=$DIR/${user}.html" & done
内容的提问来源于stack exchange,提问作者stupid_beaver
相关产品推荐
相关产品推荐

