2014-10-30 91 views

回答

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的鍵沒有內在的順序。

2

您可以使用關聯數組如果你是bash足夠新:

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

但是,我寧願切換到支持多維數組(例如Perl中)的語言。

+0

好的做法是在使用'declare'之前'取消設置assoc',因爲如果assoc'已經是一個非關聯數組,它會導致錯誤。 (即'foo =(1,2,3); declare -A foo'導致錯誤) – amphetamachine 2014-10-30 15:04:21

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