【发布时间】:2017-05-31 06:04:42
【问题描述】:
我想在 shell 中创建地图。其中每个值都是一个数组。所以地图是键:数组对。例如它可以是这样的:
"Key1" : a1 a2 a3 a4
"key2" : b1 b2 b3
"key3" : c1
基本上我的代码是这样的
listService(){
serviceType=$1
servicesList=($(getServices $serviceType))
}
listService serviceTypeA
listService serviceTypeB
listService serviceTypeC
这里的getServices 是一个函数,它根据作为$serviceType 传递的参数返回一个服务数组。所以每次我调用listService 函数时,我的serviceList 都会被新的服务列表覆盖。但我想以这样的地图形式保留来自不同服务类型的所有服务:
"serviceA" : a1 a2 a3 a4
"serviceB" : b1 b2 b3
"serviceC" : c1
之后我想根据键访问每个数组。如何实现这一点。
提前感谢您的帮助。
编辑:我尝试了@cdarke 提供的答案。这是我现在的代码:
#!/bin/bash
declare -A arrayMap
getValues(){
key=$1
case $key in
AAA )
arr=( AA AAA AAAA )
;;
BBB )
arr=( BB BB BBBB )
;;
CCC )
arr=()
;;
esac
echo "${arr[@]}"
}
fillArrayMap(){
param=$1
values=( $(getValues $param) )
printf "\nIn $param\n"
echo -e "\nArray values is: ${values[@]}\n"
printf "\nLength of the array values is : ${#values[@]}\n"
arrayMap["$param"]=$values #THIS IS THE KEY LINE
valuesList=${arrayMap[$param]}
echo -e "\nArray valuesList is: ${valuesList[@]}\n"
printf "\nLength of the array valuesList is : ${#valuesList[@]}\n"
}
fillArrayMap AAA
fillArrayMap BBB
fillArrayMap CCC
现在从输出中我可以看到valuesList 仅获取values 数组的第一个元素。但我希望valuesList 包含方法getValues 返回的所有元素。即
valuesList= ${arrayMap[$param]}
现在valuesList 应该包含所有元素,而现在它只包含 1 个元素。如何解决?
注意:我的目标是访问每个单独的元素,如 AAA 或 AA,我不需要像 AA AAA AAAA 这样的字符串作为一个整体
【问题讨论】:
-
gawk 有二维数组,(实际上是由 hastable 实现的),如果可以拖入其他逻辑,可以考虑使用 awk。
-
或者在 python 中完成你的工作。 ;-)