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

