SHELL脚本编程-普通数组(列表)和关联数组(字典)
SHELL脚本编程-普通数组(列表)和关联数组(字典)
作者:尹正杰
版权声明:原创作品,谢绝转载!否则将追究法律责任。
一.数组相关概述
变量:
存储单个元素的内存空间 数组:
存储多个元素的连续的内存空间,相当于多个变量的集合 数组名和索引 索引:编号从0开始,属于数值索引 注意:索引可支持使用自定义的格式,而不仅是数值格式,即为关联索引,bash4.0版本之后开始支持(关联数据使用时必须提前声明类型)
bash的数组支持稀疏格式(索引不连续) 声明数组: declare -a ARRAY_NAME declare -A ARRAY_NAME: 关联数组 注意:普通数组不用事先声明就可以使用,但关联数组必须提前声明才能使用,且两者不可相互转换。
[root@node101.yinzhengjie.org.cn ~]# bash --version GNU bash, version 4.2.46(2)-release (x86_64-redhat-linux-gnu) Copyright (C) 2011 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software; you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. [root@node101.yinzhengjie.org.cn ~]#
二.数组赋值
1>.一次只赋值一个元素及引用数组详解
[root@node101.yinzhengjie.org.cn ~]# declare -a title #使用数组变量时建议提前声明 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# title[0]=CEO #逐一对数组进行赋值 [root@node101.yinzhengjie.org.cn ~]# title[1]=COO [root@node101.yinzhengjie.org.cn ~]# title[2]=CTO [root@node101.yinzhengjie.org.cn ~]# title[3]=CFO [root@node101.yinzhengjie.org.cn ~]# title[4]=devops [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo $title #如果不加下标则默认打印数组的第一个元素。 CEO [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[1]} #查看指定的元素下标 COO [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[3]} CFO [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[*]} #查看数组中的所有元素 CEO COO CTO CFO devops [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[@]} #同上 CEO COO CTO CFO devops [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]} #查看数组的长度 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${#title[*]} #同上 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[*]} CEO COO CTO CFO devops [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# title[${#title[*]}]="bigdata" #在数组的末尾添加一个元素 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[@]} CEO COO CTO CFO devops bigdata [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# unset title[1] #删除索引为1的元素 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[@]} CEO CTO CFO devops bigdata [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]} 5 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# unset title #删除整个数组 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]} #由于数组依旧被删除了,长度自然也就为0啦~ 0 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[@]} #内容也被随之清空了 [root@node101.yinzhengjie.org.cn ~]#
2>.一次赋值全部元素
[root@node101.yinzhengjie.org.cn ~]# echo ${title[@]} [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# title=(CEO COO CTO CFO devops) #一次性赋值多个元素 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[@]} CEO COO CTO CFO devops [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]} 5 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# unset title [root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]} 0 [root@node101.yinzhengjie.org.cn ~]#
3>.只赋值特定元素(稀疏格式)
[root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]} 0 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# title=([0]=CEO [3]=CTO [5]=devops) [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${#title[@]} 3 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[*]} CEO CTO devops [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# unset title [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[*]} [root@node101.yinzhengjie.org.cn ~]#
4>.交互式数组值对赋值
[root@node101.yinzhengjie.org.cn ~]# echo ${title[*]} [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# read -a title #通过交互式对数组title进行赋值,各个元素用空格分开即可。 CTO CEO COO CTO [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[*]} CTO CEO COO CTO [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${#title[*]} 4 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# unset title [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${#title[*]} 0 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
5>.显示所有数组
[root@node101.yinzhengjie.org.cn ~]# student[0]="jason" [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# student[1]="yinzhengjie" [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# declare -a #显示当前shell中识别的所有数组 declare -a BASH_ARGC='()' declare -a BASH_ARGV='()' declare -a BASH_LINENO='()' declare -ar BASH_REMATCH='()' declare -a BASH_SOURCE='()' declare -ar BASH_VERSINFO='([0]="4" [1]="2" [2]="46" [3]="2" [4]="release" [5]="x86_64-redhat-linux-gnu")' declare -a DIRSTACK='()' declare -a FUNCNAME='()' declare -a GROUPS='()' declare -a PIPESTATUS='([0]="0")' declare -a student='([0]="jason" [1]="yinzhengjie")' [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
三.遍历数组
[root@node101.yinzhengjie.org.cn ~]# cat shell/title_array.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-29 #FileName: shell/title_array.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** declare -a title title[0]=CEO title[1]=COO title[2]=CTO title[3]=CFO title[4]=devops count=`seq 0 $[${#title[*]}-1]` for i in $count do echo Title is ${title[$i]} done [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/title_array.sh Title is CEO Title is COO Title is CTO Title is CFO Title is devops [root@node101.yinzhengjie.org.cn ~]#
四.数组数据处理
1>.引用数组中的元素(数组切片)
[root@node101.yinzhengjie.org.cn ~]# title=(CEO COO CTO CFO devops) #定义数组 [root@node101.yinzhengjie.org.cn ~]# echo ${title[*]} #查看数组的内容 CEO COO CTO CFO devops [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[*]:1:2} #跳过第一个元素并取出后续2个元素 COO CTO [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[*]:2} #跳过前2个元素,后面的元素全都要 CTO CFO devops [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
2>.向数组中追加元素
[root@node101.yinzhengjie.org.cn ~]# echo ${title[*]} CEO COO CTO CFO devops [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# title[${#title[*]}]="bigdata" #在数组的末尾添加一个元素 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${title[@]} CEO COO CTO CFO devops bigdata [root@node101.yinzhengjie.org.cn ~]#
3>.关联数组(在其它编程语言称之为"字典"或者"map")
[root@node101.yinzhengjie.org.cn ~]# declare -a student_info #声明为普通数组 [root@node101.yinzhengjie.org.cn ~]# student_info["name"]="尹正杰" [root@node101.yinzhengjie.org.cn ~]# student_info["age"]=18 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${student_info["name"]} #我们发现查询结果和咱们预期的不符哟! 18 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${student_info["age"]} 18 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# unset student_info #将上面的普通数组删除掉,然后使用关联数组来保存数据。 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# declare -A student_info #声明为关联数组 [root@node101.yinzhengjie.org.cn ~]# student_info["name"]="尹正杰" [root@node101.yinzhengjie.org.cn ~]# student_info["age"]=18 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${student_info["name"]} #发现关联数组的确可以保存咱们的变量呢 尹正杰 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# echo ${student_info["age"]} 18 [root@node101.yinzhengjie.org.cn ~]#
五.小试牛刀
1>.生成10个随机数保存于数组中,并找出其最大值和最小值
[root@node101.yinzhengjie.org.cn ~]# cat shell/max_min.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-29 #FileName: shell/max_min.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** declare -i min max declare -a nums for ((i=0;i<10;i++));do nums[$i]=$RANDOM [ $i -eq 0 ] && min=${nums[$i]} && max=${nums[$i]}&& continue [ ${nums[$i]} -gt $max ] && max=${nums[$i]} [ ${nums[$i]} -lt $min ] && min=${nums[$i]} done echo "All numbers are ${nums[*]}" echo "Max is $max" echo "Min is $min" [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh All numbers are 12294 23970 23546 2585 30109 8170 18085 14324 9064 16452 Max is 30109 Min is 2585 [root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh All numbers are 26022 2486 3472 95 28280 14681 6597 23915 18902 5125 Max is 28280 Min is 95 [root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh All numbers are 31524 6762 19863 31838 5255 13273 9731 7561 12069 25468 Max is 31838 Min is 5255 [root@node101.yinzhengjie.org.cn ~]#
[root@node101.yinzhengjie.org.cn ~]# cat shell/max_min.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-29 #FileName: shell/max_min.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** declare -i min max declare -a nums for ((i=0;i<10;i++));do nums[$i]=$RANDOM if [ $i -eq 0 ];then max=${nums[$i]} min=${nums[$i]} else if [ "$max" -lt "${nums[$i]}" ];then max=${nums[$i]} elif [ "$min" -gt "${nums[$i]}" ];then min=${nums[$i]} else true fi fi done echo "All numbers are ${nums[*]}" echo "Max is $max" echo "Min is $min" [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh All numbers are 13450 20504 23399 23270 15422 5545 17712 2157 24887 77 Max is 24887 Min is 77 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh All numbers are 18948 20733 6480 1389 22489 30295 21598 32705 28384 26499 Max is 32705 Min is 1389 [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/max_min.sh All numbers are 27717 18726 30016 25075 17564 28546 28358 12498 14846 29631 Max is 30016 Min is 12498 [root@node101.yinzhengjie.org.cn ~]#
2>.编写脚本,定义一个数组,数组中的元素对应的值是/var/log目录下所有以.log结尾的文件;统计出其下标为奇数的文件中的行数之和
[root@node101.yinzhengjie.org.cn ~]# cat shell/log_wc.sh #!/bin/bash # #******************************************************************** #Author: yinzhengjie #QQ: 1053419035 #Date: 2019-11-29 #FileName: shell/log_wc.sh #URL: http://www.cnblogs.com/yinzhengjie #Description: The test script #Copyright notice: original works, no reprint! Otherwise, legal liability will be investigated. #******************************************************************** declare -a files files=(/var/log/*.log) declare -i lines=0 for i in $(seq 0 $[${#files[*]}-1]); do if [ $[$i%2] -eq 1 ];then let lines+=$(wc -l ${files[$i]} | cut -d' ' -f1) fi done echo "Lines: $lines." [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# ll /var/log/*.log -rw-------. 2 root root 0 Nov 28 07:41 /var/log/boot.log -rw-------. 1 root root 15539 Nov 23 07:04 /var/log/yum.log [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# wc -l /var/log/boot.log 0 /var/log/boot.log [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# wc -l /var/log/yum.log 256 /var/log/yum.log [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]# bash shell/log_wc.sh Lines: 256. [root@node101.yinzhengjie.org.cn ~]# [root@node101.yinzhengjie.org.cn ~]#
3>.输入若干个数值存入数组中,采用冒泡算法进行升序或降序排序
4>.打印杨辉三角形
5>.将下图所示,实现转置矩阵matrix.sh
当你的才华还撑不起你的野心的时候,你就应该静下心来学习。当你的能力还驾驭不了你的目标的时候,你就应该沉下心来历练。问问自己,想要怎样的人生。
欢迎交流学习技术交流,个人微信: "JasonYin2020"(添加时请备注来源及意图备注)
作者: 尹正杰, 博客: https://www.cnblogs.com/yinzhengjie/p/11908834.html