【问题标题】:Creating a Bash associative array with glob output使用 glob 输出创建 Bash 关联数组
【发布时间】:2017-03-05 20:37:14
【问题描述】:

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

declare -A file_hash
for file in *; do
  file_hash+=([$file]=1)
done

我很好奇是否有更直接的方法来做同样的事情,有点像我们如何以这种方式初始化一个普通数组:

file_array=(*)

我从another SO 上的帖子中得到的一个想法是:

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

这是最好的方法吗?

【问题讨论】:

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

标签: bash associative-array glob


【解决方案1】:

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

file_array=(*) 用作更长、更明确的形式的快捷方式

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

因为索引 0, 1, ... 可以从 glob 扩展的文件序列中推断出来。使用关联数组,您不能做出任何此类假设,并且必须明确给出键和值。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-31
    • 1970-01-01
    • 2021-04-17
    • 1970-01-01
    • 2016-11-22
    • 2015-02-03
    • 1970-01-01
    • 2013-01-12
    相关资源
    最近更新 更多