附加到Bash中的哈希表

时间:2013-06-17 07:30:12

标签: bash shell dictionary hashtable associative-array

我正在尝试使用目录中的所有文件的文件名和另一个整数来创建哈希表。像“文件名”:“数字”。代码应该在bash 4.x中。这是我写的代码:

#!/bin/bash
DIR=`ls`
declare -A ARRAY
ZERO=0
for FILES in $DIR
do
    echo "We have $FILES"
    ARRAY+=(["$FILES"]="$ZERO")
done
echo "Done with filling up array!"
for file in "${ARRAY[@]}" ; do
    KEY="${file%%:*}"
    VALUE="${file##*:}"
    printf "%s has number %s.\n" "$KEY" "$VALUE"
done
echo "We are done here!"
echo "Check: "
printf "%s has the number %s\n" "${ARRAY[1]%%:*}" "${ARRAY[1]##*:}"

并给出了这个输出:

[Anil@computer68 test]$ bash kenzo.sh 
bash kenzo.sh 
We have dafuq.sh
We have hello.cpp
We have kenzo.sh
Done with filling up array!
0 has number 0.
0 has number 0.
0 has number 0.
We are done here!
Check: 
 has the number 

我该如何解决?散列表中的所有元素都没有文件名和数字的任何值。

1 个答案:

答案 0 :(得分:0)

在您的情况下,您只收到数组中的值,它们始终为“0”。要获取关联数组的键,请使用

for file in "${!ARRAY[@]}" ; do

(注意关联数组名称前面的!)。您可以使用${ARRAY[$file]}表示法打印数组的值。与普通数组相反,需要$,否则返回file索引。无论如何,这里返回的值总是'0'。

所以第二个循环可能是:

for KEY in "${!ARRAY[@]}" ; do
    VALUE="${ARRAY[$KEY]}"
    printf "%s has number %s.\n" "$KEY" "$VALUE"
done

<强>评论

  • 我认为没有必要在这里使用关联数组。简单的数组应该做。
  • 为什么要削减:字符?我认为它不是文件名的一部分。也许您认为关联数组的元素是KEY:VALUE形式。它不是。 ARRAY的索引为KEY,值为VALUE
  • 您可以使用DIR=`ls`。{/ li>代替for FILES in $DIR;...for FILES in *; ...
  • 这是正确的:ARRAY+=(["$FILES"]="$ZERO"),但您也可以使用ARRAY[$FILES]="$ZERO"表单。这有点健谈。