Bash中的关联数组

时间:2013-10-10 23:52:59

标签: arrays bash associative-array

我正在尝试获取文件并将文件中的项目存储到bash中的关联数组中。关联数组可能不是我行动的最佳方法,但从我的研究来看,这似乎是一个很好的选择。我有一个如下所示的文件:

personid
phone
phone
phone
personid
phone
phone
phone

请注意,persionid总是20位,电话总是10.此文件中没有其他内容,也没有空格,每行只有一个。我想把这些映射到一个关联数组,我的密钥是personid,我的价值是电话。

我就这篇文章所做的代码如下:

declare -A person

while read key; do

    if [ ${#key} -eq 20 ] ; then
        personID="$key"
    else
       phone="$key"
    fi

    person=( ["$personID"]="$phone" )

done < myFile.txt

for i in "${!person[@]}"
do
    echo "key: $i"
    echo "value: ${person[$i]}"
done

它将正确存储和打印一个personID作为键,一个手机作为值....但手机应该有多个值。我在想,当我指派人时,我一定是做错了,或者把它放错了。但是我已经玩了很长时间了,并且无法做到正确。从来没有使用过关联数组,所以有点麻烦。在此先感谢您的帮助!

1 个答案:

答案 0 :(得分:1)

关联数组与任何其他数组没有什么不同,因为从键(或索引)到值总是会有1:1的完全映射。在您的情况下,您需要从密钥(personID)到值(电话号码)的1:多映射。一种方法是简单地存储一个电话号码列表,这些电话号码实际上是单个&#34;值映射到personID。您可以使用空格或逗号分隔符或其他任何内容构建您喜欢的列表。

例如,如果您想:作为分隔符,您可以执行此操作以将每个电话号码添加到列表中:

if [ -n ${person[$personID]} ] ; then
    person[$personID]}="${person[$personID]}:$phone"
else
    person[$personID]}="$phone"
fi