You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 12:42:17