Bash中如何动态拼接变量名正确引用CICD环境变量
Bash动态拼接变量名引用CI/CD变量实现方案
问题场景
在GitLab Runner环境编写Bash脚本时,存在两个命名规则固定的字符串变量:
$CICD_MY_INTERNAL_STRING $CICD_MY_EXTERNAL_STRING
需要实现workerapp()函数,支持通过传入参数动态引用对应变量:调用workerapp INTERNAL时获取$CICD_MY_INTERNAL_STRING的值,调用workerapp EXTERNAL时获取$CICD_MY_EXTERNAL_STRING的值,供后续业务逻辑调用。
初始错误实现代码如下:
function workerapp() { echo -e $CICD_MY_$1_STRING }
该实现运行时仅能返回类似CICD_MY_EXTERNAL的截断结果,无法获取完整变量名对应的实际值。
根因分析
Bash默认变量解析逻辑中,下划线_属于合法的变量名字符,因此$CICD_MY_$1_STRING会被解析器拆分为三个独立段处理:
- 读取变量
$CICD_MY的值 - 拼接传入的第一个位置参数
$1的值 - 拼接字面量字符串
_STRING
解析器不会将CICD_MY_<传入参数>_STRING识别为单个完整变量名,因此出现变量名截断、取值失败的问题。
可用实现方案
方案1:Bash原生间接引用(推荐)
该方案语法简洁,无注入风险,兼容GitLab Runner默认搭载的所有Bash版本(2.0及以上):
function workerapp() { # 先拼接得到完整的目标变量名 local target_var="CICD_MY_${1}_STRING" # 通过间接引用语法读取对应变量的值 echo "${!target_var}" }
注意:原代码中
echo的-e参数非必要不添加,该参数会强制解析输出内容中的转义字符(如\n、\t),可能导致变量实际值被意外修改。
方案2:eval动态展开(POSIX兼容)
如果Runner执行环境可能切换到POSIX标准sh(无Bash特性支持),可使用eval实现,该场景下变量名由固定规则拼接,无外部可控输入,不存在命令注入风险:
function workerapp() { eval "echo \"\$CICD_MY_${1}_STRING\"" }
调用方式
函数编写完成后,直接传入对应参数即可获取目标值:
# 获取内部字符串变量值 workerapp INTERNAL # 获取外部字符串变量值 workerapp EXTERNAL
如果需要将返回值传递给其他逻辑,可直接通过命令替换捕获,或在函数内将值赋值给指定全局变量,避免多层转义导致的内容异常。
内容的提问来源于stack exchange,提问作者Patrick
相关产品推荐
相关产品推荐

