如何在BASH中制作3D阵列?

时间:2014-10-30 14:48:52

标签: arrays linux bash multidimensional-array

我想在BASH中编写/制作/使用[m] [n] [k]的3D数组。据我所知,BASH不支持不是1D的阵列。

任何想法怎么做?

3 个答案:

答案 0 :(得分:4)

使用精心设计的关联数组键伪造多维度:

declare -A ary
for i in 1 2 3; do 
    for j in 4 5 6; do 
        for k in 7 8 9; do 
            ary["$i,$j,$k"]=$((i*j*k))
        done
    done
done
for key in "${!ary[@]}"; do printf "%s\t%d\n" "$key" "${ary[$key]}"; done | sort
1,4,7   28
1,4,8   32
1,4,9   36
1,5,7   35
1,5,8   40
1,5,9   45
1,6,7   42
1,6,8   48
1,6,9   54
2,4,7   56
2,4,8   64
2,4,9   72
2,5,7   70
2,5,8   80
2,5,9   90
2,6,7   84
2,6,8   96
2,6,9   108
3,4,7   84
3,4,8   96
3,4,9   108
3,5,7   105
3,5,8   120
3,5,9   135
3,6,7   126
3,6,8   144
3,6,9   162

我使用sort因为assoc.array的键没有固有的顺序。

答案 1 :(得分:3)

如果你的bash足够新,你可以使用关联数组:

unset assoc
declare -A assoc
assoc["1.2.3"]=x

但是,我宁愿切换到支持多维数组的语言(例如Perl)。

答案 2 :(得分:1)

与C一样,您可以使用偏移量来模拟多维数组。

#! /bin/bash

xmax=100
ymax=150
zmax=80
xymax=$((xmax*ymax))
vol=()

for ((z=0; z<zmax; z++)); do
for ((y=0; y<ymax; y++)); do
for ((x=0; x<xmax; x++)); do
    ((t = z*xymax+y*xmax+x))
    if ((vol[t] == 0)); then
        ((vol[t] = vol[t-xymax] + vol[t-ymax] + vol[t-1]))
    fi
done
done
done