创建具有 glob 输出的 Bash 关联数组
Creating a Bash associative array with glob output
我想在 Bash 中创建一个关联数组,使用从 glob 派生的文件名作为键。这是我正在做的事情:
declare -A file_hash
for file in *; do
file_hash+=([$file]=1)
done
我很好奇是否有更直接的方法来做同样的事情,有点像我们这样初始化一个普通数组:
file_array=(*)
我从 another post 上得到的一个想法是:
file_array=(*)
declare -A file_hash=( $(echo ${file_array[@]} | sed 's/[^ ]*/[&]=&/g') )
这是最好的方法吗?
您的循环是执行此操作的正确方法。任何其他风险都可能无法正确处理包含 shell 可能特殊处理的字符的文件名,即空格(尤其是换行符)和 glob 元字符,如 *
、[]
、?
、等等
file_array=(*)
用作更长、更明确形式的快捷方式
file_array=([0]=file1 [1]=file2 ...)
因为索引 0、1、... 可以从 glob 扩展的文件序列中推断出来。使用关联数组,您不能做出任何此类假设,并且必须明确给出键和值。
我想在 Bash 中创建一个关联数组,使用从 glob 派生的文件名作为键。这是我正在做的事情:
declare -A file_hash
for file in *; do
file_hash+=([$file]=1)
done
我很好奇是否有更直接的方法来做同样的事情,有点像我们这样初始化一个普通数组:
file_array=(*)
我从 another post 上得到的一个想法是:
file_array=(*)
declare -A file_hash=( $(echo ${file_array[@]} | sed 's/[^ ]*/[&]=&/g') )
这是最好的方法吗?
您的循环是执行此操作的正确方法。任何其他风险都可能无法正确处理包含 shell 可能特殊处理的字符的文件名,即空格(尤其是换行符)和 glob 元字符,如 *
、[]
、?
、等等
file_array=(*)
用作更长、更明确形式的快捷方式
file_array=([0]=file1 [1]=file2 ...)
因为索引 0、1、... 可以从 glob 扩展的文件序列中推断出来。使用关联数组,您不能做出任何此类假设,并且必须明确给出键和值。