一、数组的分类
1)普通数组,只能以数字整数作为索引(元素名称,下标)
2)关联数组,可以以字符串作为索引
语法结构:
数组名称 [元素名称]=元素的值
1、普通数组
数组定义方法:
第一种:按照索引定义
[root@test ~]# array[0]=shell
[root@test ~]# array[1]=mysql
[root@test ~]# array[2]=docker
第二种:直接赋值
#直接赋值
[root@test ~]# array=(shell test hehe doker k8s)
[root@test ~]# echo ${array[*]}
shell test hehe doker k8s
#直接赋值和索引赋值结合
[root@test ~]# array=([5]=shell mysql reedis [20]=hehe)
[root@test ~]# echo ${array[*]}
shell mysql reedis hehe
[root@test ~]# echo ${!array[*]}
5 6 7 20
#支持命令
[root@test ~]# array=(`echo hehe mysql docker`)
[root@test ~]# echo ${array[*]}
hehe mysql docker
[root@test ~]# echo ${!array[*]}
0 1 2
unset array 取消数组
查看数组中的值
#查看数组中的值
[root@test ~]# echo ${array[0]}
shell
[root@test ~]# echo ${array[1]}
mysql
[root@test ~]# echo ${array[2]}
docker
[root@test ~]# echo ${array[*]}
shell mysql docker
[root@test ~]# echo ${array[@]}
shell mysql docker
#查看索引
[root@test ~]# echo ${!array[*]}
0 1 2
案例:两种遍历数组方式
#!/bin/bash
#定义数组
ip=(
10.0.0.1
10.0.0.2
10.0.0.3
10.0.0.4
10.0.0.5
)
#1、按照内容遍历
for i in ${ip[*]}
do
ping -c1 -W1 $i &>/dev/null
if [ $? -eq 0 ];then
echo $i 在线
fi
done
#2、按照索引遍历
for i in ${!ip[*]}
do
echo ${ip[$i]}
done
2、关联数组
定义方式
#普通定义方式无法定义关联数组
[root@test day05]# array[index1]=shell
[root@test day05]# array[index2]=mysql
[root@test day05]# array[index3]=redis
[root@test day05]# echo ${array[*]}
redis
[root@test day05]# declare -A array #需要先将数组声明为关联数组
[root@test day05]# array[index1]=shell
[root@test day05]# array[index2]=mysql
[root@test day05]# array[index3]=redis
[root@test day05]# echo ${array[*]}
shell mysql redis
案例:统计字符出现的次数
#创建一个包含字符的文件
[root@test day05]# cat sex.txt
f
f
m
m
f
f
m
m
x
#编写脚本读取文件中字符出现的次数
[root@test day05]# cat sex.sh
#!/bin/bash
declare -A array
while read line
do
let array[$line]++
done<sex.txt
for i in ${!array[*]}
do
echo $i 出现了 ${array[$i]} 次
done
[root@test day05]# sh sex.sh
f 出现了 4 次
m 出现了 4 次
x 出现了 1 次
抓阄案例:
[root@test day05]# cat zhuajiu.sh
#需求:
#1.输入姓名,姓名后面出现一个1-100的随机数
#2.出现过的数字不能再出现
#3.取随机数的top3
#!/bin/bash
while true
do
read -p "请输入你的姓名: " name
if [ $name == ok ];then
echo "抓阄完毕排序如下 "
sort -rnk2 ran.txt
exit
fi
while true
do
ran=`echo $((RANDOM%10+1))`
if [ `cat ran.txt|grep -w $ran|wc -l` -eq 1 ];then
continue
else
echo -e "$name \t $ran"|tee -a ran.txt
break
fi
done
done