如果我想要一个 2D bash 数组,有没有推荐的方法来做到这一点,例如N x M
安排?有几次,我不得不结合 case 语句来定义array1
、array2
、arrayN
每个元素 - 但这非常笨拙。M
我意识到可以定义一个大数组并计算和元素X
之间的 1-1 映射- 但这似乎需要大量工作才能正确完成。X[something]
[i,j]
是否存在任何一组可以合理有效地完成此操作的函数?我意识到这有点像让 Bash 模仿 FORTRAN。
答案1
您始终可以切换到具有多维数组的ksh93
(bash
大多数事情首先借用了其语法)。
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