gpt4 book ai didi

arrays - 如何创建键 :array in shell? 的映射

转载 作者:行者123 更新时间:2023-11-29 08:55:11 25 4
gpt4 key购买 nike

我想在 shell 中创建 map 。其中每个值都是一个数组。所以 map 是键:数组对。例如它可以是这样的:

"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 都会被新的服务列表覆盖。但我想以这样的 map 形式保留来自不同服务类型的所有服务:

"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) 引用数组变量时,您只会得到第一个元素

关于arrays - 如何创建键 :array in shell? 的映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41675740/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com