本篇文章继续给大家介绍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年运维经验,持续分享运维干货,感谢大家的阅读和关注!