我正在尝试使用目录中的所有文件的文件名和另一个整数来创建哈希表。像“文件名”:“数字”。代码应该在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
我该如何解决?散列表中的所有元素都没有文件名和数字的任何值。
答案 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"
表单。这有点健谈。