数组 – 如何创建key的映射:shell中的数组?

我想在 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这样的字符串作为一个整体

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

得到:

"serviceTypeC": C1 C2 C3 C4
"serviceTypeB": B1 B2 B3 B4
"serviceTypeA": A1 A2 A3 A4

编辑新问题:

改变:

arrayMap["$param"]=$values     # THIS IS THE KEY LINE
valuesList=${arrayMap[$param]}

至:

arrayMap["$param"]=${values[@]} 
valuesList=( ${arrayMap[$param]}  )

当你通过它的名字($values)引用数组变量时,你只得到第一个元素.

本站公众号
   欢迎关注本站公众号,获取更多程序园信息
开发小院