我想在BASH中编写/制作/使用[m] [n] [k]的3D数组。据我所知,BASH不支持不是1D的阵列。
任何想法怎么做?
答案 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