如何在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
相关产品推荐
相关产品推荐

