【问题标题】:Appending to a hash table in Bash附加到 Bash 中的哈希表
【发布时间】:2013-06-13 02:32:04
【问题描述】:

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

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

【问题讨论】:

标签: bash shell dictionary hashtable associative-array


【解决方案1】:

在您的情况下,您只接收来自数组的值,这些值始终为“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
  • 您可以使用for FILES in *; ...,而不是DIR=`ls`for FILES in $DIR;...
  • 这是正确的:ARRAY+=(["$FILES"]="$ZERO"),但您也可以使用ARRAY[$FILES]="$ZERO" 形式。话有点多。

【讨论】:

    猜你喜欢
    • 2021-07-22
    • 2014-01-10
    • 1970-01-01
    • 2016-02-08
    • 2018-01-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多