1

我正在尝试使用目录中所有文件的文件名和另一个整数创建一个哈希表。像“文件名”:“数字”。代码应该在 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 

我如何解决它?哈希表中的所有元素都没有文件名和编号的任何值。

4

1 回答 1

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形式的。它不是。的索引ARRAYKEY,值是VALUE
  • 而不是DIR=`ls`andfor FILES in $DIR;...你可以使用for FILES in *; ....
  • 这是正确的:ARRAY+=(["$FILES"]="$ZERO"),但您也可以使用ARRAY[$FILES]="$ZERO"表单。它有点健谈。
于 2013-06-17T08:00:32.393 回答