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

如何在Bash中基于另一个变量间接引用目标变量?

在Bash中通过变量间接引用目标变量的解决办法

我太懂这种困扰了——你想通过package变量的值来拼接出另一个变量名(比如foobar_darwin_amd64)并引用它,但直接写echo "$package_darwin_amd64"完全没用,因为Bash会把整个package_darwin_amd64当成一个全新的、未定义的变量名,根本不会先解析$package的值再拼接后缀。

下面给你几个实用的解决办法,按需选择:

方法1:使用Bash的间接引用语法 ${!var}

这是最安全也最常用的方式,先把完整的目标变量名拼接出来,再用间接引用获取它的值:

# 先定义你的基础变量和目标变量
package="foobar"
foobar_darwin_amd64="some-value-you-want"

# 拼接出完整的目标变量名
target_var_name="${package}_darwin_amd64"

# 用间接引用获取值
echo "${!target_var_name}"
# 输出:some-value-you-want

这个语法在大多数现代Bash版本里都支持,逻辑清晰,也没有安全风险。

方法2:使用eval命令(谨慎使用)

如果你的场景比较简单,也可以用eval来实现,但要注意:如果package的值来自不可信输入,eval可能会执行恶意代码,所以一定要谨慎。用法如下:

package="foobar"
foobar_darwin_amd64="some-value-you-want"

# 用eval解析并执行拼接后的命令
eval "echo \$${package}_darwin_amd64"
# 输出:some-value-you-want

这里的\$是转义符,确保eval先把${package}替换成foobar,再执行echo $foobar_darwin_amd64。

方法3:Bash 4.3+ 专属的namevar特性

如果你的Bash版本是4.3或更高,可以用declare -n定义一个“变量名变量”,让它直接指向目标变量:

package="foobar"
foobar_darwin_amd64="some-value-you-want"

# 声明target是foobar_darwin_amd64的引用
declare -n target="${package}_darwin_amd64"

# 直接引用target就相当于引用原变量
echo "$target"
# 输出:some-value-you-want

这种方式更直观,操作起来和直接用原变量没区别。

内容的提问来源于stack exchange,提问作者Justin

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 03:15:24