sau*_*rav 8 unix arrays bash shell
我想在shell中创建地图.每个值都是一个数组.所以地图是关键:数组对.例如,它可以是这样的:
"Key1" : a1 a2 a3 a4
"key2" : b1 b2 b3
"key3" : c1
Run Code Online (Sandbox Code Playgroud)
基本上我的代码看起来像这样
listService(){
serviceType=$1
servicesList=($(getServices $serviceType))
}
listService serviceTypeA
listService serviceTypeB
listService serviceTypeC
Run Code Online (Sandbox Code Playgroud)
这getServices是一个函数,它根据传递的参数返回一个服务数组$serviceType.因此每次我调用该listService函数时,我serviceList都会被新服务列表覆盖.但我希望以不同的服务类型保留所有服务,如下所示:
"serviceA" : a1 a2 a3 a4
"serviceB" : b1 b2 b3
"serviceC" : c1
Run Code Online (Sandbox Code Playgroud)
之后,我想基于密钥访问每个阵列.如何实现这一目标.
在此先感谢您的帮助.
编辑:我尝试了@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
Run Code Online (Sandbox Code Playgroud)
现在从输出我可以看到valuesList只获得values数组的第一个元素.但我想valuesList包含该方法返回的所有元素getValues.即
valuesList= ${arrayMap[$param]}
Run Code Online (Sandbox Code Playgroud)
现在valuesList应该包含所有元素,而现在它只包含1个元素.如何解决?
注意:我的目标是访问每个单独的元素,如AAA或AA,我不需要像AA AAA AAAA这样的字符串作为一个整体
Bash 不支持多维数组,但我认为您不需要。您可以在数组元素中以列表的形式存储字符串,这将满足您的要求。
# My made-up version of getServices
getServices() {
nm="$1"
last=${nm##*Type}
retn=(${last}1 ${last}2 ${last}3 ${last}4)
echo "${retn[@]}"
}
declare -A serviceList
listService(){
serviceType="$1"
# Here I use the key to make an assignment, which adds to the hash
serviceList["$serviceType"]=$(getServices $serviceType)
}
listService serviceTypeA
listService serviceTypeB
listService serviceTypeC
for key in ${!serviceList[@]}
do
echo "\"$key\": ${serviceList[$key]}"
done
Run Code Online (Sandbox Code Playgroud)
给出:
"serviceTypeC": C1 C2 C3 C4
"serviceTypeB": B1 B2 B3 B4
"serviceTypeA": A1 A2 A3 A4
Run Code Online (Sandbox Code Playgroud)
编辑新问题:
改变:
arrayMap["$param"]=$values # THIS IS THE KEY LINE
valuesList=${arrayMap[$param]}
Run Code Online (Sandbox Code Playgroud)
到:
arrayMap["$param"]=${values[@]}
valuesList=( ${arrayMap[$param]} )
Run Code Online (Sandbox Code Playgroud)
当您仅通过名称 ( $values)引用数组变量时,您只会获得第一个元素。