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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【运维知识高级篇】超详细的Shell编程讲解5(普通数组+关联数组+抓阄项目)

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


数组

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

一、普通数组

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

1、语法结构

数组名称[元素名称]=元素的值

2、数组定义方法

1、按照索引定义

1. [root@Web01 ~]# array[0]=shell
2. [root@Web01 ~]# array[1]=mysql
3. [root@Web01 ~]# array[2]=docker

查看数组的值

1. [root@Web01 ~]# echo ${array[0]}
2. shell
3. [root@Web01 ~]# echo ${array[1]}
4. mysql
5. [root@Web01 ~]# echo ${array[2]}
6. docker
7. [root@Web01 ~]# echo ${array[*]}
8. shell mysql docker
9. [root@Web01 ~]# echo ${array[@]}
10. shell mysql docker

查看数组索引(下标、元素名称)

1. [root@Web01 ~]# echo ${!array[*]}
2. 0 1 2

取消数组

1. [root@Web01 ~]# unset array
2. [root@Web01 ~]# echo ${!array[*]}
3. 
4. [root@Web01 ~]#

2、直接赋值定义

注意默认索引从0开始

1. [root@Web01 ~]# array=(shell test hehe docker k8s)
2. [root@Web01 ~]# echo ${!array[*]}
3. 0 1 2 3 4
4. [root@Web01 ~]# echo ${array[*]}
5. shell test hehe docker k8s

3、混合定义

1. [root@Web01 ~]# array=([5]=shell test hehe docker [20]=k8s)
2. [root@Web01 ~]# echo ${!array[*]}
3. 5 6 7 8 20
4. [root@Web01 ~]# echo ${array[*]}
5. shell test hehe docker k8s

4、支持命令的取值定义

1. [root@Web01 ~]# array=(`echo shell mysql redis`)
2. [root@Web01 ~]# echo ${array[*]}
3. shell mysql redis
4. [root@Web01 ~]# echo ${!array[*]}
5. 0 1 2

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

1. 10.0.0.2
2. 10.0.0.4
3. 202.106.0.20
4. 114.114.114
5. 223.5.5.5
6. 8.8.8.8

可以通过取数组值的方式遍历

1. [root@LB00 Day05]# cat ping.sh
2. #!/bin/basha
3. ip=(
4. 10.0.0.2
5. 10.0.0.4
6. 202.106.0.20
7. 114.114.114
8. 223.5.5.5
9. 8.8.8.8
10. 1.5.4.9
11. )
12. for i in ${ip[*]}
13. do
14.   ping -c1 -W1 $i &> /dev/null
15.   if [ $? == 0 ];then
16.     echo $i 可以通 
17.   else
18.     echo $i 不通
19.   fi
20. done
21. [root@LB00 Day05]# sh ping.sh
22. 10.0.0.2 可以通
23. 10.0.0.4 可以通
24. 202.106.0.20 不通
25. 114.114.114 不通
26. 223.5.5.5 可以通
27. 8.8.8.8 可以通
28. 1.5.4.9 不通

还可以通过取索引的方式遍历

1. [root@LB00 Day05]# cat ping.sh
2. #!/bin/basha
3. ip=(
4. 10.0.0.2
5. 10.0.0.4
6. 202.106.0.20
7. 114.114.114
8. 223.5.5.5
9. 8.8.8.8
10. 1.5.4.9
11. )
12. for i in ${!ip[*]}
13. do
14.        ping -c1 -W1 ${ip[$i]} &> /dev/null
15. if [ $? == 0 ];then
16.                echo ${ip[$i]} 可以通 
17. else
18.                echo ${ip[$i]} 不通
19.        fi
20. done
21. [root@LB00 Day05]# sh ping.sh
22. 10.0.0.2 可以通
23. 10.0.0.4 可以通
24. 202.106.0.20 不通
25. 114.114.114 不通
26. 223.5.5.5 可以通
27. 8.8.8.8 可以通
28. 1.5.4.9 不通

二、关联数组

可以以字符串作为索引

定义方式与普通数组一样,字符串数组不认识,所以会默认为0

1. [root@LB00 Day05]# array[index1]=shell
2. [root@LB00 Day05]# array[index2]=mysql
3. [root@LB00 Day05]# array[index3]=redis
4. [root@LB00 Day05]# echo ${array[*]}
5. redis
6. [root@LB00 Day05]# echo ${!array[*]}
7. 0

声明为关联数组,让字符串认识

1. [root@LB00 Day05]# unset array
2. [root@LB00 Day05]# declare -A array
3. [root@LB00 Day05]# array[index1]=shell
4. [root@LB00 Day05]# array[index2]=mysql
5. [root@LB00 Day05]# array[index3]=redis
6. [root@LB00 Day05]# echo ${array[*]}
7. shell mysql redis
8. [root@LB00 Day05]# echo ${!array[*]}
9. index1 index2 index

1、判断文本中男女数量

1. [root@LB00 Day05]# cat xingbie.txt
2. boy
3. girl
4. boy
5. boy
6. girl
7. xxx
8. [root@LB00 Day05]# declare -A array
9. [root@LB00 Day05]# let array[boy]++    #通过数组元素值自增去判断数量
10. [root@LB00 Day05]# echo ${array[boy]}    #就是元素值是数字,下标是文字
11. 1
12. [root@LB00 Day05]# let array[boy]++
13. [root@LB00 Day05]# echo ${array[boy]}
14. 2
15. 
16. [root@LB00 Day05]# cat array.sh
17. #!/bin/bash
18. declare -A array
19. while read line
20. do
21.   let array[$line]++
22. done<xingbie.txt
23. 
24. for i in ${!array[*]}
25. do
26.   echo $i 出现了 ${array[$i]} 次
27. done
28. [root@LB00 Day05]# sh array.sh
29. xxx 出现了 1 次
30. girl 出现了 2 次
31. boy 出现了 3 次

2、统计IP出现的次数

1. [root@LB00 Day05]# cat count_ip.sh
2. #!/bin/bash
3. declare -A array
4. while read line
5. do
6.  ip=`echo $line|awk '{print $1}'`
7.  let array[$ip]++
8. done</var/log/nginx/access.log
9. 
10. for i in ${!array[*]}
11. do
12.   echo $i 出现了 ${array[$i]} 次
13. done
14. [root@LB00 Day05]# sh count_ip.sh
15. 172.16.1.5 出现了 207 次

抓阄项目

需求:

1、输入姓名,姓名后面出现一个1-100的随机数

2、出现过的数字不能再出现

3、最后取随机数的TOP排行

1. [root@LB00 Day05]# cat zhuajiu.sh
2. #!/bin/bash
3. while true
4. do
5. menu(){
6. echo -e "\t\t\t\033[31m 1.抓阄 \033[0m"
7. echo -e "\t\t\t\033[32m 2.当前排名 \033[0m"
8. }
9. menu
10. read -p "请输入模式的编号[1|2]: " moshi
11. case $moshi in
12.   1)
13.   read -p "请输入你的姓名: " name
14.   while true
15.   do
16.   ran=`echo $((RANDOM%100+1))`
17.   if [ -f ran.txt ];then
18.     if [ `grep -w $ran ran.txt|wc -l` == 1 ];then
19.       continue
20.     else
21.       echo $name $ran >> ran.txt 
22.       break
23.     fi
24.   else
25.     echo $name $ran >> ran.txt
26.     break
27.   fi
28.   done
29.   echo 名字为 $name 号码为 $ran
30.   ;;
31.   2)
32.   echo 抓阄排行如下
33.   if [ -f ran.txt ];then
34.     sort -rnk2 ran.txt
35.   else
36.     echo 当前还没有排名
37.   fi
38.   ;;
39.   *)
40.   echo "Usage: [1|2]"
41. esac
42. done
43. [root@LB00 Day05]# sh zhuajiu.sh
44.        1.抓阄 
45.        2.当前排名 
46. 请输入模式的编号[1|2]: 1
47. 请输入你的姓名: q
48. 名字为 q 号码为 32
49.        1.抓阄 
50.        2.当前排名 
51. 请输入模式的编号[1|2]: 1
52. 请输入你的姓名: w
53. 名字为 w 号码为 55
54.        1.抓阄 
55.        2.当前排名 
56. 请输入模式的编号[1|2]: 1
57. 请输入你的姓名: e
58. 名字为 e 号码为 51
59.        1.抓阄 
60.        2.当前排名 
61. 请输入模式的编号[1|2]: 2
62. 抓阄排行如下
63. w 55
64. e 51
65. q 32
66.        1.抓阄 
67.        2.当前排名 
68. 请输入模式的编号[1|2]: ^Z
69. [17]+  Stopped                 sh zhuajiu.sh

我是koten,10年运维经验,持续分享运维干货,感谢大家的阅读和关注!

 

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
4天前
|
Unix Shell Linux
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
本文提供了几个Linux shell脚本编程问题的解决方案,包括转置文件内容、统计词频、验证有效电话号码和提取文件的第十行,每个问题都给出了至少一种实现方法。
LeetCode刷题 Shell编程四则 | 194. 转置文件 192. 统计词频 193. 有效电话号码 195. 第十行
|
4天前
|
Shell Linux
Linux shell编程学习笔记30:打造彩色的选项菜单
Linux shell编程学习笔记30:打造彩色的选项菜单
|
2天前
|
Shell Linux 开发工具
|
2天前
|
监控 Unix Shell
shell脚本编程学习
shell脚本编程
22 12
|
4天前
|
Shell Linux
Linux shell编程学习笔记82:w命令——一览无余
Linux shell编程学习笔记82:w命令——一览无余
|
29天前
|
存储 Unix Shell
shell脚本编程基础
【9月更文挑战第4天】
36 12
|
28天前
|
Shell Linux
Shell 编程 编写hello word
Shell 编写hello word
41 5
|
2月前
|
数据采集 运维 Devops
探索Python编程之美:从基础到进阶自动化运维的变革之路:从脚本到DevOps
【8月更文挑战第30天】在数字化时代的浪潮中,编程已经成为一门重要的技能。Python以其简洁明了的语法和强大的功能,成为了许多初学者的首选编程语言。本文将通过浅显易懂的语言,带领读者从Python的基础语法出发,逐步深入到面向对象编程、网络爬虫开发以及数据分析等高级应用,旨在帮助初学者构建扎实的编程基础,并激发他们进一步探索编程世界的热情。文章不仅分享实用的编程技巧,还将探讨如何将编程知识应用于解决实际问题,以期培养读者的问题解决能力和创新思维。
|
2月前
|
Shell KVM 虚拟化
Shell 数组编程
【8月更文挑战第22天】 Shell 数组编程
43 10
|
2月前
|
机器学习/深度学习 运维 Ubuntu
自动化运维:使用Ansible简化日常任务探索Python编程之美:从基础到进阶
【8月更文挑战第28天】在快速迭代的软件开发周期中,运维工作的效率至关重要。本文将介绍如何使用Ansible这一强大的自动化工具来简化日常的运维任务,通过代码示例展示如何配置和使用Ansible,以及它如何帮助提升工作效率和减少人为错误。文章将深入讨论Ansible的核心概念,包括Playbooks和Tasks,并探讨如何利用这些概念进行高效的系统管理。 【8月更文挑战第28天】在数字时代的浪潮中,编程已成为一门艺术和科学。本文将通过Python语言的镜头,带领读者踏上一段从零基础到熟练运用的旅程。我们将一起探索Python的简洁语法、强大库支持以及它在数据科学、网络开发等领域的应用。无论你
下一篇
无影云桌面