本篇文章继续给大家介绍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

持续分享运维干货,感谢大家的阅读和关注!

请输入图片描述

仅有一条评论

  1. [...]练习4:使用case语句编写nginx启动脚本点击此文章查看代码练习5:抓阄程序,执行脚本后,想去的同学输入英文名字全拼,产生随机数01-99之间的数字,数字越大就去参加项目实践,前面已经抓到的数字,下次不能再出现相同数字;第一个同学输入名字后,屏幕输出信息,并将名字和数字记录到文件里,程序不能退出,继续等待别的学生输入。点击此文章查看代码练习6:打印一个菜单如下,然后使用循环加case语句输出用[...]

发表评论

召唤看板娘