如何在Bash中实现与变量关联的字符串列表?
Bash中实现多组索引变量的简洁方案
你想要创建$one、$two这类变量,通过$one[1]返回"a"、$one[2]返回"b"这类效果,Bash确实没有原生二维数组,用case语句太啰嗦,这里给你两种更简洁的实现思路,先说说你自己的代码逻辑,再拓展到多组变量的场景:
你的现有单数组实现
你给出的代码是单组索引的基础实现,用普通数组就能搞定:
example=(a b c d e) read selection # 写入文件 printf ${example[$selection]} > file
注意Bash数组默认从0开始索引,所以example[0]是"a",如果要让输入1对应"a",可以给数组加个空的首元素:example=("" a b c d e),这样example[1]就返回"a"了。
实现多组类似$one/$two的索引变量
如果要同时维护多组这样的索引集合,有两种简洁方式:
方式1:定义多个普通数组+间接引用
直接给每组数据单独定义数组,再通过间接引用动态调用:
# 定义多组数组,下标从1开始,首元素留空 one=("" a b c d e) two=("" x y z) three=("" foo bar baz qux) # 读取用户选择的数组名和索引 read -p "输入数组名(one/two/three): " arr_name read -p "输入索引: " idx # 间接引用获取对应数组的元素并写入文件 printf "${!arr_name[$idx]}" > file
这里${!arr_name[$idx]}是Bash的间接引用语法,会把arr_name的值当作数组名,再取对应索引的元素。
方式2:用关联数组模拟二维结构
如果组数和索引比较灵活,不想定义大量单独数组,可以用关联数组,把键设为数组名_索引的形式:
# 声明关联数组 declare -A multi_arr # 给不同组的索引赋值 multi_arr["one_1"]="a" multi_arr["one_2"]="b" multi_arr["two_1"]="x" multi_arr["two_2"]="y" multi_arr["three_3"]="baz" # 读取输入并取值写入文件 read arr_name idx printf "${multi_arr["${arr_name}_${idx}"]}" > file
这种方式不需要提前定义固定数组,新增组或索引直接给关联数组加键值对就行,适合动态场景。
这两种方法都比写一堆case语句简洁太多,维护起来也方便。
内容的提问来源于stack exchange,提问作者gaalfont
相关产品推荐
相关产品推荐

