These search terms have been highlighted:[trick]
2008-11-05
bash で2次元配列を扱いたいときがまれにある.が, bash には1次元配列しか無いし,配列の要素に配列を代入することもできない.そこで疑似的に2次元配列を使う方法を考えてみた. 以下のようにする.
#!/bin/bash
array2() # name i j
{
eval y='${'$1$2'['$3']}'
echo $y
}
M0=(あ い う)
M1=(じゃ ば 馬)
M2=(ぱ ぷ ぺ)
M3[0]=hoge
M3[1]=he
M3[2]=xx
M3[3]=huge
i=1
j=2
echo $(array2 M $i $j) # M の ($i,$j)=(1,2) 要素にアクセスする
この array2 関数を定義しておくだけで, $i などのインデックス変数を使って配列の要素にアクセスできるようになる.
要するに,変数 Mi で i 行目のリストを保存しているわけだ.で, M に i をくっつけて無理矢理作った変数 Mi (1次元配列) から j 番目の要素を取り出すのが array2.つまり M1[2] のようなアクセスを, Mi[j] のように変数 (i,j) に対しても可能にしているというだけ.
おまけ †
#!/bin/bash
copy_array() # src dest
{
eval $2='(${'$1'[@]})'
}
a=('orz..' 'm(-_-)m' '(´O`)b')
copy_array a b # a を b にコピー
echo ${b[2]}
これは1次元配列をコピーする関数.