シェルスクリプトで2次元配列を扱った時の備忘録です。

シェルスクリプトで2次元(それ以上)配列を使う場合は、evalを使えば可能らしい。(参考文献1より)
と、言うことでさっそく参考文献を見ながらやってみました。

■2次元配列スクリプト

[root@example ~]# vi array.sh
#!/bin/sh
for (( x = 0; x <= 2; x++ )) {
 for (( y = 0; y <= 2; y++ )) {
  eval ARRAY${x}${y}=\$RANDOM
 }
}
これで、完成!

上記スクリプトは、ARRAYxy配列に乱数を代入していく。

実際に数値が代入されているか以下を追加して確認してみる。

#!/bin/sh
for (( x = 0; x <= 2; x++ )) {
 for (( y = 0; y <= 2; y++ )) {
  eval ARRAY${x}${y}=\$RANDOM
 }
}

for (( x = 0; x <= 2; x++ )) {
 for (( y = 0; y <= 2; y++ )) {
  eval echo "ARRAY[$x][$y] = \$ARRAY${x}${y}"
 }
}
[root@example ~]# ./array.sh
ARRAY[0][0] = 15129
ARRAY[0][1] = 28957
ARRAY[0][2] = 18244
ARRAY[1][0] = 27728
ARRAY[1][1] = 13300
ARRAY[1][2] = 31765
ARRAY[2][0] = 30541
ARRAY[2][1] = 31249
ARRAY[2][2] = 8416

■配列の値を違う変数に入れる場合
・失敗例
[root@example ~]# vi array.sh
#!/bin/sh
for (( x = 0; x <= 2; x++ )) {
 for (( y = 0; y <= 2; y++ )) {
  eval ARRAY${x}${y}=\$RANDOM
 }
}

for (( x = 0; x <= 2; x++ )) {
 for (( y = 0; y <= 2; y++ )) {
  RESULT=`eval echo \$ARRAY${x}${y}`
  echo $RESULT
 }
}
・失敗例を実行
[root@example ~]# ./array.sh
00
01
02
10
11
12
20
21
22
これだと、xyの変数がRESULTに格納されてしまう。

・成功例
[root@example ~]# vi array.sh
#!/bin/sh
for (( x = 0; x <= 2; x++ )) {
 for (( y = 0; y <= 2; y++ )) {
  eval ARRAY${x}${y}=\$RANDOM
 }
}

for (( x = 0; x <= 2; x++ )) {
 for (( y = 0; y <= 2; y++ )) {
  RESULT=`eval echo \\$ARRAY${x}${y}`
  echo $RESULT
 }
}
・成功例を実行
[root@example ~]# ./array.sh
8536
22513
15515
7945
6390
18941
16975
23252
17220

これで、RESULT変数にARRAYxy配列の数値が格納される。

■配列の比較
[root@example ~]# vi array.sh
#!/bin/sh
for (( x = 0; x <= 2; x++ )) {
 for (( y = 0; y <= 2; y++ )) {
  eval ARRAY${x}${y}=\$RANDOM
 }
}

for (( x = 0; x <= 2; x++ )) {
 for (( y = 0; y <= 2; y++ )) {
  if [ $y -eq 0 ] ; then
    RESULT=`eval echo \\$ARRAY${x}${y}`
  else
    RESULT2=`eval echo \\$ARRAY${x}${y}`
    NUM=`echo "$RESULT < $RESULT2" | bc `
    [ $NUM -eq 1 ] && RESULT=$RESULT2
  fi
 }
echo $RESULT
}

ここでは、配列に格納されている数値の比較をしてみました。

RESULTに初期数値がセットされて、RESULT2と比較します。

もし、RESULT2の方が大きければRESULTにRESULT2の数値を格納します。
# 実はこれがしたかっただけ:-)

参考文献
1. http://mstssk.blogspot.com/2009/04/eval-command-in-bash-shell-script.html


10月 26, 2011 at 8:36 pm by 黒ぶちメガネ
Category: シェルスクリプト