LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 2792|回复: 2

bash二维数组的实现

[复制链接]
发表于 2008-2-18 14:32:21 | 显示全部楼层 |阅读模式
用bash的都知道:现在的bash只支持一维数组,不支持二维数组的,通过摸索我找到以下的替代方法
1.用变量法
看实例:
#!/bin/sh
#二维数组的赋值
for((i=0;i<10;i++))
do
for((j=0;j<10;j++))
do
export tmp$i$j=$[i+j]
#不能用tmp$i$j=$[i+j]
done
done
#二维数组的使用
for((i=0;i<10;i++))
do
for((j=0;j<10;j++))
do
if [ $[tmp$i$j] == $[tmp$j$i] ];then
echo $[tmp$i$j] $[tmp$j$i]
fi
done
done

2.用一维数组+bash内嵌
看实例:
#!/bin/sh
#二维数组的赋值
for((i=0;i<10;i++))
do
for((j=0;j<10;j++))
do
echo tmp$i[j]=\$[i+j] > temp
. temp
done
done
#二维数组的使用
for((i=0;i<10;i++))
do
for((j=0;j<10;j++))
do
echo "if [ \${tmp$i[j]} == \${tmp$j} ];then" > temp
echo "echo \${tmp$i[j]} \${tmp$j}" >> temp
echo fi >> temp
. temp
done
done
rm -rf temp
可以看出第1种比第2种要方便的多
 楼主| 发表于 2008-2-18 15:03:17 | 显示全部楼层
根据moolight和palomino|working的建议,第1种方法需要修正:
#!/bin/sh
#二维数组的赋值
for((i=0;i<10;i++))
do
for((j=0;j<10;j++))
do
export tmp${i}tmp$j=$[i+j]
#不能用tmp${i}tmp$j=$[i+j]
done
done
#二维数组的使用
for((i=0;i<10;i++))
do
for((j=0;j<10;j++))
do
if [ $[tmp${i}tmp$j] == $[tmp${j}tmp$i] ];then
echo $[tmp${i}tmp$j] $[tmp${j}tmp$i]
else
echo $[tmp${i}tmp$j] $[tmp${j}tmp$i]
fi
done
done
把tmp${i}tmp$j当一个变量看待,其中${i}加上{}是为i断义,面中间的tmp是用来分开当i和j可能出现的重复,比如:
i=1;j=11是tmp${i}$j为tmp111
i=11;j=1时tmp${i}$j也为tmp111相同,出现错误
回复 支持 反对

使用道具 举报

 楼主| 发表于 2008-2-19 10:55:22 | 显示全部楼层
while [[ -n $[tmp${i}tmp$j] ]]无法使用,判断失效
可以用
eval tmp='$'tmp${i}tmp$j
while [[ -n $tmp ]]
替代

改进:
1.用变量法
#!/bin/sh
#二维数组的赋值
for((i=0;i<10;i++))
do
for((j=0;j<10;j++))
do
eval tmp${i}tmp$j='$[i+j]'
done
done
#二维数组的使用
tmp1tmp2=2
for((i=0;i<10;i++))
do
for((j=0;j<10;j++))
do
tmpij=tmp${i}tmp$j
tmpji=tmp${j}tmp$i
if [ $[$tmpij] != $[$tmpji] ];then
echo $[$tmpij]  $[$tmpji]
fi
done
done
#是否有值
for((i=0;i<10;i++))
do
j=0
eval tmpij='$'tmp${i}tmp$j
while [[ -n $tmpij ]]
do
echo $[$tmpij] $[tmp${i}tmp$j]
j=$[j+1]
eval tmpij='$'tmp${i}tmp$j
done
done
2.用一维数组
#!/bin/sh
#二维数组的赋值
for((i=0;i<10;i++))
do
for((j=0;j<10;j++))
do
eval tmp$i[j]=$[i+j]
done
done
tmp1[2]=0
#二维数组的使用
for((i=0;i<10;i++))
do
for((j=0;j<10;j++))
do
tmpij=tmp$i[$j]
tmpji=tmp$j[$i]
if [ $[tmp$i[j]] != $[tmp$j] ];then
echo $[$tmpij]  $[$tmpji] $tmpij
fi
done
done
#是否有值
for((i=0;i<10;i++))
do
j=0
eval tmpij='${'tmp$j[$i]'}'
while [[ -n $tmpij ]]
do
echo $tmpij $[tmp$i[j]]
j=$[j+1]
eval tmpij='${'tmp$j[$i]'}'
done
done
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表