使用glob输出创建Bash关联数组

使用glob输出创建Bash关联数组,bash,associative-array,glob,Bash,Associative Array,Glob,我想在Bash中创建一个关联数组,将从glob派生的文件名作为键。以下是我正在做的: declare -A file_hash for file in *; do file_hash+=([$file]=1) done 我很想知道是否有一种更直接的方法来做同样的事情,有点像我们这样初始化普通数组: file_array=(*) 我从SO上的帖子中得到的一个想法是: file_array=(*) declare -A file_hash=( $(echo ${file_array[@]}

我想在Bash中创建一个关联数组,将从glob派生的文件名作为键。以下是我正在做的:

declare -A file_hash
for file in *; do
  file_hash+=([$file]=1)
done
我很想知道是否有一种更直接的方法来做同样的事情,有点像我们这样初始化普通数组:

file_array=(*)
我从SO上的帖子中得到的一个想法是:

file_array=(*)
declare -A file_hash=( $(echo ${file_array[@]} | sed 's/[^ ]*/[&]=&/g') )

这是最好的方法吗?

您的循环是正确的方法。任何其他操作都有可能无法正确处理包含shell可能会特别处理的字符的文件名,即空格(特别是换行符)和全局元字符,如
*
[]
,等等

file\u array=(*)
用作更长、更显式表单的快捷方式

file_array=([0]=file1 [1]=file2 ...)

因为指数0,1。。。可以从全局扩展的文件序列推断。对于关联数组,您不能做出任何这样的假设,并且必须显式地给出键和值。

受echo方法的启发,这在某些测试中可以正常工作,但需要eval:
declare-A filehash;eval$(printf'filehash+=([%s]=1);'*.txt)