在Bash中是否可以给以数组成员作为名称的变量赋值?
问题根因
let 是 Bash 中专用于整数算术运算求值的内置命令,仅支持整数赋值场景,无法直接赋值字符串字面量:
当你执行 let ${vars[0]}="hello" 时,Bash 会将右侧的 "hello" 内容作为算术表达式解析,而非你预期的字符串字面量。你得到结果5的原因是当前Shell环境中存在值为5的hello变量,算术上下文会直接读取该变量的值赋给domain_name;如果hello未定义,默认会当作0处理,还可能触发未定义变量警告。
Bash 完全支持将数组元素值作为变量名动态赋值,常用的兼容实现方案如下:
正确实现方案
方案1:使用nameref名引用(Bash 4.3+ 支持,语法最简洁)
通过declare -n创建指向目标变量的引用,直接操作引用即可修改原变量:
# 声明存储变量名的数组 declare -a vars=("domain_name" "port" "username") # 创建指向数组第一个元素值对应变量的引用 declare -n target="${vars[0]}" # 直接给引用赋值,等价于给domain_name赋值 target="hello" # 输出结果为 hello echo "$domain_name"
方案2:使用printf -v(兼容性最佳,Bash 3.1+ 支持)
利用printf的-v参数直接将值写入指定变量名的变量,不需要额外声明:
declare -a vars=("domain_name" "port" "username") # 直接将hello写入变量名等于${vars[0]}的变量 printf -v "${vars[0]}" "%s" "hello" # 输出结果为 hello echo "$domain_name"
方案3:使用declare动态声明
直接通过declare拼接变量名和值完成赋值,若在函数内赋值给全局变量需要加-g参数:
declare -a vars=("domain_name" "port" "username") # 动态声明并赋值 declare "${vars[0]}=hello" # 输出结果为 hello echo "$domain_name"
内容的提问来源于stack exchange,提问作者analytical
相关产品推荐
相关产品推荐

