我想在shell中创建映射。每个值都是一个数组。所以地图是关键:数组对。例如,它可以是这样的:如何在shell中创建key:array的映射?
"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
应包含所有要素,而不是现在只包含一个元素。如何解决这个问题?
注:我的目标是访问每个元素像AAA或AA,我并不需要它作为一个整体像AA AAA AAAA字符串
gawk有2-d数组,(实际上它是由hastable实现的),你可以考虑使用awk,如果你的其他逻辑可以被拖入。 – Kent
或在python中完成你的工作。 ;-) – Kent