本篇文章继续给大家介绍Shell编程,给大家介绍数组相关内容,再配合之前内容,基本已经能够完成Shell中的绝大部分需求了。
目录
3、ping以下IP,查看是否能ping通(数组定义的值通过for循环的方式取出来)
数组
之前的变量好比一个箱子装一个东西,数组相当于是一个箱子里装多个小箱子,小箱子里装东西,每个东西都有编号
一、普通数组
只能以数字整数作为索引(元素名称,也叫下标)
1、语法结构
数组名称[元素名称]=元素的值
2、数组定义方法
1、按照索引定义
[root@Web01 ~]# array[0]=shell
[root@Web01 ~]# array[1]=mysql
[root@Web01 ~]# array[2]=docker
查看数组的值
[root@Web01 ~]# echo ${array[0]}
shell
[root@Web01 ~]# echo ${array[1]}
mysql
[root@Web01 ~]# echo ${array[2]}
docker
[root@Web01 ~]# echo ${array[*]}
shell mysql docker
[root@Web01 ~]# echo ${array[@]}
shell mysql docker
查看数组索引(下标、元素名称)
[root@Web01 ~]# echo ${!array[*]}
0 1 2
取消数组
[root@Web01 ~]# unset array
[root@Web01 ~]# echo ${!array[*]}
[root@Web01 ~]#
2、直接赋值定义
注意默认索引从0开始
[root@Web01 ~]# array=(shell test hehe docker k8s)
[root@Web01 ~]# echo ${!array[*]}
0 1 2 3 4
[root@Web01 ~]# echo ${array[*]}
shell test hehe docker k8s
3、混合定义
[root@Web01 ~]# array=([5]=shell test hehe docker [20]=k8s)
[root@Web01 ~]# echo ${!array[*]}
5 6 7 8 20
[root@Web01 ~]# echo ${array[*]}
shell test hehe docker k8s
4、支持命令的取值定义
[root@Web01 ~]# array=(`echo shell mysql redis`)
[root@Web01 ~]# echo ${array[*]}
shell mysql redis
[root@Web01 ~]# echo ${!array[*]}
0 1 2
3、ping以下IP,查看是否能ping通(数组定义的值通过for循环的方式取出来)
10.0.0.2
10.0.0.4
202.106.0.20
114.114.114
223.5.5.5
8.8.8.8
可以通过取数组值的方式遍历
[root@LB00 Day05]# cat ping.sh
#!/bin/basha
ip=(
10.0.0.2
10.0.0.4
202.106.0.20
114.114.114
223.5.5.5
8.8.8.8
1.5.4.9
)
for i in ${ip[*]}
do
ping -c1 -W1 $i &> /dev/null
if [ $? == 0 ];then
echo $i 可以通
else
echo $i 不通
fi
done
[root@LB00 Day05]# sh ping.sh
10.0.0.2 可以通
10.0.0.4 可以通
202.106.0.20 不通
114.114.114 不通
223.5.5.5 可以通
8.8.8.8 可以通
1.5.4.9 不通
还可以通过取索引的方式遍历
[root@LB00 Day05]# cat ping.sh
#!/bin/basha
ip=(
10.0.0.2
10.0.0.4
202.106.0.20
114.114.114
223.5.5.5
8.8.8.8
1.5.4.9
)
for i in ${!ip[*]}
do
ping -c1 -W1 ${ip[$i]} &> /dev/null
if [ $? == 0 ];then
echo ${ip[$i]} 可以通
else
echo ${ip[$i]} 不通
fi
done
[root@LB00 Day05]# sh ping.sh
10.0.0.2 可以通
10.0.0.4 可以通
202.106.0.20 不通
114.114.114 不通
223.5.5.5 可以通
8.8.8.8 可以通
1.5.4.9 不通
二、关联数组
可以以字符串作为索引
定义方式与普通数组一样,字符串数组不认识,所以会默认为0
[root@LB00 Day05]# array[index1]=shell
[root@LB00 Day05]# array[index2]=mysql
[root@LB00 Day05]# array[index3]=redis
[root@LB00 Day05]# echo ${array[*]}
redis
[root@LB00 Day05]# echo ${!array[*]}
0
声明为关联数组,让字符串认识
[root@LB00 Day05]# unset array
[root@LB00 Day05]# declare -A array
[root@LB00 Day05]# array[index1]=shell
[root@LB00 Day05]# array[index2]=mysql
[root@LB00 Day05]# array[index3]=redis
[root@LB00 Day05]# echo ${array[*]}
shell mysql redis
[root@LB00 Day05]# echo ${!array[*]}
index1 index2 index
1、判断文本中男女数量
[root@LB00 Day05]# cat xingbie.txt
boy
girl
boy
boy
girl
xxx
[root@LB00 Day05]# declare -A array
[root@LB00 Day05]# let array[boy]++ #通过数组元素值自增去判断数量
[root@LB00 Day05]# echo ${array[boy]} #就是元素值是数字,下标是文字
1
[root@LB00 Day05]# let array[boy]++
[root@LB00 Day05]# echo ${array[boy]}
2
[root@LB00 Day05]# cat array.sh
#!/bin/bash
declare -A array
while read line
do
let array[$line]++
done<xingbie.txt
for i in ${!array[*]}
do
echo $i 出现了 ${array[$i]} 次
done
[root@LB00 Day05]# sh array.sh
xxx 出现了 1 次
girl 出现了 2 次
boy 出现了 3 次
2、统计IP出现的次数
[root@LB00 Day05]# cat count_ip.sh
#!/bin/bash
declare -A array
while read line
do
ip=`echo $line|awk '{print $1}'`
let array[$ip]++
done</var/log/nginx/access.log
for i in ${!array[*]}
do
echo $i 出现了 ${array[$i]} 次
done
[root@LB00 Day05]# sh count_ip.sh
172.16.1.5 出现了 207 次
抓阄项目
需求:
1、输入姓名,姓名后面出现一个1-100的随机数
2、出现过的数字不能再出现
3、最后取随机数的TOP排行
[root@LB00 Day05]# cat zhuajiu.sh
#!/bin/bash
while true
do
menu(){
echo -e "\t\t\t\033[31m 1.抓阄 \033[0m"
echo -e "\t\t\t\033[32m 2.当前排名 \033[0m"
}
menu
read -p "请输入模式的编号[1|2]: " moshi
case $moshi in
1)
read -p "请输入你的姓名: " name
while true
do
ran=`echo $((RANDOM%100+1))`
if [ -f ran.txt ];then
if [ `grep -w $ran ran.txt|wc -l` == 1 ];then
continue
else
echo $name $ran >> ran.txt
break
fi
else
echo $name $ran >> ran.txt
break
fi
done
echo 名字为 $name 号码为 $ran
;;
2)
echo 抓阄排行如下
if [ -f ran.txt ];then
sort -rnk2 ran.txt
else
echo 当前还没有排名
fi
;;
*)
echo "Usage: [1|2]"
esac
done
[root@LB00 Day05]# sh zhuajiu.sh
1.抓阄
2.当前排名
请输入模式的编号[1|2]: 1
请输入你的姓名: q
名字为 q 号码为 32
1.抓阄
2.当前排名
请输入模式的编号[1|2]: 1
请输入你的姓名: w
名字为 w 号码为 55
1.抓阄
2.当前排名
请输入模式的编号[1|2]: 1
请输入你的姓名: e
名字为 e 号码为 51
1.抓阄
2.当前排名
请输入模式的编号[1|2]: 2
抓阄排行如下
w 55
e 51
q 32
1.抓阄
2.当前排名
请输入模式的编号[1|2]: ^Z
[17]+ Stopped sh zhuajiu.sh
我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!