【运维知识高级篇】超详细的Shell编程讲解5(普通数组+关联数组+抓阄项目)

本篇文章继续给大家介绍Shell编程,给大家介绍数组相关内容,再配合之前内容,基本已经能够完成Shell中的绝大部分需求了。

目录

数组

一、普通数组

1、语法结构

2、数组定义方法

3、ping以下IP,查看是否能ping通(数组定义的值通过for循环的方式取出来)

二、关联数组

1、判断文本中男女数量

2、统计IP出现的次数

抓阄项目


数组

之前的变量好比一个箱子装一个东西,数组相当于是一个箱子里装多个小箱子,小箱子里装东西,每个东西都有编号

一、普通数组

只能以数字整数作为索引(元素名称,也叫下标)

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年运维经验,持续分享运维干货,感谢大家的阅读和关注!

猜你喜欢

转载自blog.csdn.net/qq_37510195/article/details/130739023