2D bash 数组:这可能吗?

2D bash 数组:这可能吗?

如果我想要一个 2D bash 数组,有没有推荐的方法来做到这一点,例如N x M安排?有几次,我不得不结合 case 语句来定义array1array2arrayN每个元素 - 但这非常笨拙。M

我意识到可以定义一个大数组并计算和元素X之间的 1-1 映射- 但这似乎需要大量工作才能正确完成。X[something][i,j]

是否存在任何一组可以合理有效地完成此操作的函数?我意识到这有点像让 Bash 模仿 FORTRAN。

答案1

您始终可以切换到具有多维数组的ksh93bash大多数事情首先借用了其语法)。

var=(
  (a b)
  (c d)
)

用于:

$ print -r -- "${var[0][1]}"
b

循环遍历所有元素:

for i in "${!var[@]}"; do
  for j in "${!var[$i][@]}"; do
    print -r "var[$i,$j]=${var[$i][$j]}"
  done
done

答案2

您可以使用一维关联数组(awk 的方式[1])来模拟多维数组,或者通过移动索引来使用索引数组来模拟多维数组。

问题在于您无法以明显、自然的方式迭代它们。

declare -A a  # associative array
i=2; j=3; a[$i,$j]=4; echo ${a[2,3]}

unset a
declare -a a  # indexed array, the default
i=2; j=3; a[i<<16|j]=4; echo ${a[2<<16|3]}

请注意,索引bash 中的数组是;a[1<<30]=1不会1Gi - 1在实际 RAM 中或虚拟地址空间中创建空槽。另外,由于 bash 的索引数组是实现为双向链表,对元素的随机访问是慢点与关联数组相比(它们使用与 bash 用于缓存外部命令路径相同的哈希表实现)。

[1] awk 自动将表达式转换a[x,y,z]为-- ,其中的a[x SUBSEP y SUBSEP z]默认值为( ),控制字符不应出现在键中。 GNU awk 还具有真正的多维数组作为非标准扩展。经典的 awk multi-dim 数组模拟也可以在 perl 中使用 ( => )。SUBSEP\x1c^\$;SUBSEP

相关内容