如何在Bash中通过变量指定目标数组并引用其元素?
解决Bash中间接引用数组的问题
方法一:用Nameref(推荐,Bash 4.3+支持)
这是最直观安全的方式,直接给变量创建一个数组的"别名":
# 定义你的数组 array_1=("Mike" "George" "Sam" "1234" "5678") array_2=("Albert" "Isabel" "Sami" "4567" "9821") # 声明nameref,把myarray关联到目标数组 declare -n myarray="array_1" # 之后直接用myarray操作就行,和用原数组完全一样 name1="${myarray[0]}" name2="${myarray[1]}" number1="${myarray[3]}" # 要切换数组?直接改myarray的值就行,不用动后面的代码 myarray="array_2" # 此时myarray[0]就是Albert了
declare -n会让myarray成为目标数组的引用,所有对myarray的操作都会直接作用到原数组上,完全符合你的需求。
方法二:兼容旧版Bash(无Nameref支持)
如果你的Bash版本低于4.3,可以用间接展开结合eval(注意:仅在数组名是你自己控制的安全内容时使用,避免注入风险):
myarray="array_1" # 间接获取数组元素 eval "name1=\${${myarray}[0]}" eval "name2=\${${myarray}[1]}" # 切换数组同样只需要改myarray的值 myarray="array_3"
这里的eval会把${${myarray}[0]}解析成${array_1[0]},从而拿到对应元素。
为什么你之前的方法没用?
你之前写myarray="array_1"只是把字符串"array_1"存在了myarray里,Bash不会自动把它当成数组名解析。${myarray[0]}在这里其实是取普通变量myarray的"数组形式"(Bash里普通变量会被视为只有一个元素的数组),结果就是字符串"array_1"本身,不是你要的数组元素。
可选的数组结构调整
如果后续要频繁切换数组,也可以把所有数组名放在一个索引数组里,循环或者按需切换:
# 定义所有数组 array_1=("Mike" "George" "Sam" "1234" "5678") array_2=("Albert" "Isabel" "Sami" "4567" "9821") array_3=("Michel" "Tom" "Cathy" "321" "5664") # 把数组名存到一个数组里 all_arrays=(array_1 array_2 array_3) # 选第一个数组来用 declare -n current_array="${all_arrays[0]}" echo "${current_array[0]}" # 输出Mike # 切换到第二个数组 current_array="${all_arrays[1]}" echo "${current_array[0]}" # 输出Albert
内容的提问来源于stack exchange,提问作者Mike
相关产品推荐
相关产品推荐

