数组的定义
所谓数组,是有序的元素序列,将有限个类型相同的变量的集合命名,这个名称为数组名。
索引:又叫脚标,标号默认从0开始,属于数值索引。在 Bash4.0 后支持自定义索引格式,叫做关联数组。
数组的声明:declare -a ARRAY_NAME (普通数组可以不事先声明)
declare -A ARRAY_NAME (关联数组必须要事先声明)
两者不可以互相转换
数组的操作
赋值
1)对单个元素赋值:数组名[脚标号]="值"
2)对多个元素赋值:数组名=([脚标0]="值" [脚标1]="值" ...)
3)对所有元素赋值:数组名=("值0" "值1" "值2" ...)
引用
引用单个元素:${数组名[脚标]} 脚标缺省默认为0
引用所有元素:${数组名[*/@]}
引用数组长度:${#数组名[*/@]}
删除
删除单个元素:unset 数组名[脚标号] 会导致稀疏格式,脚标号不连续
删除所有元素:unset 数组名
范例:破解由随机数命令生成数的MD5密文
#!/bin/bash
declare -i i=1
md5list=("efbaf275cd" "4be9c40b8b" "44b2395c46" "f8c8873ce0" "b902c16c8b" "ad865d2f63")
while [ "$i" -le 32768 -a ${#md5list[*]} != 0 ] ;do
Break="`echo $i | md5sum | cut -c1-10`"
for (( j=0;j<${#md5list[*]};j++ )) ;do
if [ "$Break" = "${md5list[$j]}" ] ;then
echo $i
unset md5list[$j]
break
fi
done
let i+=1
done
数组的切片与追加
切片
语法:${数组名[@]:offset:numble}
offset:跳过的元素个数 numble:引用的元素个数,缺省默认为偏移后所有元素
追加
因为数组脚标默认从0开始,当数组不是稀疏格式时,最后一个元素的脚标是 n-1,而数组长度为n
语法:数组名[${#数组名[*/@]}]=值
范例:实现转换矩阵
#!/bin/bash
declare -A arr
num=1
read -p "size is: " s
for ((i=0;i<s;i++)) ;do
for ((j=0;j<s;j++)) ;do
arr[$i$j]=$num
let num+=1
echo -ne "${arr[$i$j]}\t"
done
echo
done
for ((i=0;i<s;i++)) ;do
for ((j=i;j<s;j++)) ;do
tmp=${arr[$i$j]}
arr[$i$j]=${arr[$j$i]}
arr[$j$i]=$tmp
done
done
echo
for ((i=0;i<s;i++)) ;do
for ((j=0;j<s;j++)) ;do
echo -en "${arr[$i$j]}\t"
done
echo
done