首页 > 解决方案 > 以文件列表为值的关联数组…

问题描述

我在使用 Bash 的关联数组时遇到了一些问题:我正在寻找一种解决方案,将带有文件名的数组分配给关联数组。

它应该看起来像:

/Applications/Setup.app => ([0] = "/Applications/Setup.app/IDStore@2x.png"
                            [1] = "/Applications/Setup.app/IDMessages@2x.png"
                            [2] = "/Applications/Setup.app/IDMusic New@2x.png")

声明字典/哈希表/关联数组不是问题:

declare -A Dictionary

要获取我正在使用“readarray”的键,并结合“find”:

readarray -d '' Applications < <(find "/Applications" -name "*.app" -print0)

如果目录的名称中有空格,那不是问题。现在我需要在应用程序的目录中找到 PNG 文件:

if [ ${#Applications[*]} -gt 0 ]; then
    for App in "${Applications[@]}"; do
        readarray -d '' Files < <(find "$App" -iname "*.png" -type f -print0)

        for File in "${Files[@]}"; do
            Dictionary["$App"]+="$File"
        done
    done
fi

我不明白的问题是,如何将第二个“查找”的结果作为文件列表添加到声明的关联数组中?如果我使用 Delimiter ' ' 设置 readarray 一些包含空格的文件被破坏。

下一个问题是如何获取 for-Loop 中的值?我也用 readarray 试过这个,但这不适用于名称中带有空格的文件。

for Key in "${!Dictionary[@]}"; do
    readarray -d ' ' Values <<< "${Dictionary[$Key]}"

    for Value in "${Values[@]}"; do
        echo "$Value"
    done
done

如果我运行上面的脚本,这就是我得到的:

/Applications/Setup.app/IDStore@2x.png/Applications/Setup.app/IDMessages@2x.png/Applications/Setup.app/IDMusic 
New@2x.png

但我想要这个:

/Applications/Setup.app/IDStore@2x.png
/Applications/Setup.app/IDMessages@2x.png
/Applications/Setup.app/IDMusic New@2x.png

是否有机会使用 Bash 5.0.3 进行这项工作?

目标是在没有 awk / grep / sed 的情况下使用大多数功能,因此它使用 Bash 的内置命令运行。

标签: arraysbashdictionaryhashtableassociative-array

解决方案


数组数组,考虑这种方法:

[[ ${Applications[@]} ]] && {
    for i in "${!Applications[@]}"; do
        readarray -d '' "Files$i" < <(find "${Applications[$i]}" -iname "*.png" -type f -print0)
        Dictionary["${Applications[$i]}"]="Files$i"
    done
}

然后检索值使用这个:

for key in "${!Dictionary[@]}"; do
    val="${Dictionary[$key]}[@]"
    echo "$key: ${!val}"
done

并在这里检查


推荐阅读