Appending to a hash table in Bash

2019-06-02 08:32发布

I am trying to make a hash table with the file name of all files in a directory and another integer number. Like "File Name" : "number". The code should be in bash 4.x. This is the code which I wrote:

#!/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]##*:}"

and it gives this output:

[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 

How do I fix it? None of the elements in the hash table have any values of the file name and the number.

1条回答
【Aperson】
2楼-- · 2019-06-02 08:57

In your case you receives only the values from the array, which are always '0'. To get the keys of an associative array, use

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

(Mind the ! before the name of the associative array). You can print the value of the array using the ${ARRAY[$file]} notation. Contrary to normal arrays here the $ is needed, otherwise it returns the file indexed. Anyway here the returned value will be always '0'.

So the second loop could be:

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

Comments

  • I see no point to use associative arrays here. Simple array should do.
  • Why do you cut the : character? As I see it is not part of the file names. Maybe You think that the element of an associative array is in KEY:VALUE form. It is not. The index of the ARRAY is KEY and the value is VALUE.
  • Instead of DIR=`ls` and for FILES in $DIR;... you could use for FILES in *; ....
  • This is correct: ARRAY+=(["$FILES"]="$ZERO"), but you can use ARRAY[$FILES]="$ZERO" form as well. It is a little bit more talkative.
查看更多
登录 后发表回答