数组的定义
所谓数组,是有序的元素序列,将有限个类型相同的变量的集合命名,这个名称为数组名。
索引:又叫脚标,标号默认从0开始,属于数值索引。在 Bash4.0 后支持自定义索引格式,叫做关联数组。
数组的声明:declare -a ARRAY_NAME (普通数组可以不事先声明)
declare -A ARRAY_NAME (关联数组必须要事先声明)
两者不可以互相转换
数组的操作
赋值
1)对单个元素赋值:数组名[脚标号]="值"
2)对多个元素赋值:数组名=([脚标0]="值" [脚标1]="值" ...)
3)对所有元素赋值:数组名=("值0" "值1" "值2" ...)
引用
引用单个元素:${数组名[脚标]} 脚标缺省默认为0
扫描二维码关注公众号,回复:
1016232 查看本文章
引用所有元素:${数组名[*/@]}
引用数组长度:${#数组名[*/@]}
删除
删除单个元素: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