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

Shell脚本递归获取变量值出现${$A}: bad substitution报错的解决方法

解决Bash递归获取变量值的"bad substitution"报错问题

我懂你想要实现的效果——通过变量A的值(也就是X),间接获取变量X的值Y,但Bash不支持${$A}这种直接嵌套的变量引用语法,这就是你看到line 4: ${$A}: bad substitution报错的原因。下面给你几种靠谱的解决办法:

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

这是最简洁安全的方式,Bash原生支持这种间接引用写法:

#!/bin/bash
A="X"
X="Y"
B=${!A}  # 这里通过A的值"X",间接引用变量X
echo $B  # 输出结果:Y

${!A}的作用就是:先解析变量A的内容,再把这个内容当作变量名去获取对应的值,完美匹配你的需求。

方法2:使用eval命令(需注意安全风险)

eval可以执行字符串形式的命令,我们可以用它来构造变量引用:

#!/bin/bash
A="X"
X="Y"
B=$(eval echo \$$A)  # \$$A会先展开为$X,eval执行echo $X得到Y
echo $B  # 输出结果:Y

⚠️ 注意:eval会执行任何传入的命令字符串,如果你A的值是不可信的内容,可能会带来安全问题,所以优先推荐方法1。

方法3:Bash 4.3+版本使用命名引用(nameref)

如果你的Bash版本是4.3及以上,可以用declare -n创建命名引用,相当于给变量起别名:

#!/bin/bash
A="X"
X="Y"
declare -n ref=$A  # ref现在是变量X的引用
B=$ref
echo $B  # 输出结果:Y

这种方式适合需要多次操作目标变量的场景,操作ref就等同于操作X。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.01 00:58:09