如何在Shell脚本中将字符串作为变量名调用其对应取值
你要实现的是Shell中的间接变量引用,有以下几种常用方案:
- 方案1:Bash 2.0+ 支持的间接扩展(最推荐)
直接使用${!变量名容器}语法即可完成间接取值,你的测试场景可以改写为:
$ hello=sup $ hi=hello $ echo "${!hi}" sup
如果变量名存储在数组中,遍历数组时用同样的语法取值即可:
# 示例:变量名存储在数组中批量取值 $ hello=sup $ foo=bar $ var_arr=("hello" "foo") $ for name in "${var_arr[@]}"; do echo "${!name}"; done sup bar
- 方案2:Bash 4.3+ 支持的nameref(名称引用)
可以声明一个引用变量绑定到目标变量名,后续直接操作引用变量就等于操作目标变量:
$ hello=sup $ hi=hello $ declare -n ref="$hi" $ echo "$ref" sup $ ref=hi $ echo "$hello" hi
- 方案3:POSIX 兼容写法(适配所有标准Shell,注意安全风险)
如果需要兼容非Bash的POSIX Shell,可以用eval实现,但注意仅在变量名完全可控的场景下使用,避免代码注入风险:
$ hello=sup $ hi=hello $ eval "echo \$$hi" sup
你之前的写法
echo $echo $hi`` 执行时,Shell先完成命令替换得到hello,拼接后得到的$hello不会触发二次变量解析,只会作为普通字符串输出,因此得不到预期结果。
内容的提问来源于stack exchange,提问作者Amine
相关产品推荐
相关产品推荐

