GitLab CI调用curl命令时变量jrun无法展开求助
GitLab CI中curl命令变量无法展开的解决方法
问题根源
你用单引号包裹了整个curl命令,而bash中单引号内的变量不会被解析展开,所以$jrun始终是原字符串,不会替换成run1234。
可行解决方案
方案1:直接去掉外层单引号
直接执行未被单引号包裹的命令,双引号内的变量会正常解析:
curl "https://gitlab.com/api/v4/projects/454939/variables/$jrun" -H "Authorization: Bearer $GIT_SERVICE_TOKEN"
这个是最简单直接的写法,GitLab CI的shell executor会正确展开$jrun和$GIT_SERVICE_TOKEN。
方案2:用数组存储命令(推荐,避免eval风险)
如果需要把命令存到变量里执行,优先用数组存储命令和参数,避免eval带来的安全隐患:
# 定义命令数组,此时变量已完成展开 Jcommand=(curl "https://gitlab.com/api/v4/projects/454939/variables/$jrun" -H "Authorization: Bearer $GIT_SERVICE_TOKEN") # 执行数组中的命令 "${Jcommand[@]}"
方案3:修正eval的使用方式(不推荐,但可应急)
如果一定要用eval,需要确保定义变量时用双引号,同时转义内部的双引号,让变量在定义阶段就完成展开:
Jcommand="curl \"https://gitlab.com/api/v4/projects/454939/variables/$jrun\" -H \"Authorization: Bearer $GIT_SERVICE_TOKEN\"" eval "$Jcommand"
额外验证
可以在curl命令前加echo先预览最终执行的命令,确认变量是否正确展开:
echo curl "https://gitlab.com/api/v4/projects/454939/variables/$jrun" -H "Authorization: Bearer $GIT_SERVICE_TOKEN"
内容的提问来源于stack exchange,提问作者SSS
相关产品推荐
相关产品推荐

