Linux基础之bash脚本进阶篇-数组
数组
什么是数组?
计算机中的数组指的是具有相同类型的若干变量按照一定的顺序组织起来的一种数据类型。
通俗点来说数组就是变量的一种,按现在的术语来说就是变量圈子中的一个,只不过这个变量圈子都是相同类型的变量并有一定的组织顺序。
数组的格式
array[key]=value
array:表示数组变量的名称
key:表示数组元素的索引又称下标
value:表示key对应的数组元素的值
大体了解了什么是数组,下面就来了解下如何定义数组或如何创建数组
定义数组
定义数组主要有如下几种类型
1、通过指定元素来定义数组
1 2 3 4 5 6 7 | #!/bin/bash #通过指定元素来定义数组 #指定数组元素值 array[0]=8 array[2]=two #输出数组元素 echo "${array[@]}" |
运行脚本
1 2 | [root@docker test ] # sh 20160910-1 8 two |
2、通过declare语句来定义数组
1 2 3 4 5 6 7 8 9 | #!/bin/bash #通过declare语句来定义数组 #定义数组 -a 选项表示后面定义的是一个名为array的数组。 declare -a array #为元素赋值 array[0]=1 array[1]=2 #输出元素值 echo "${array[@]}" |
运行脚本
1 2 | [root@docker test ] # sh 20160910-2 1 2 |
通过上面两个例子,其实可以发现在shell中这样的声明不是非常必要的,因为在shell中,所有的变量不必显示定义就可以用作数组,在某种意义上所有变量都是数组:赋值给没有下标的变量与赋值给下标内为0的元素效果是相同的。
示例:
1 2 3 4 | #!/bin/bash tom=1 echo "${tom}" echo "${tom[0]}" |
运行脚本
1 2 3 | [root@docker test ] # sh 20160910-3 1 1 |
由结果可知赋值给没有下标的变量与赋值给下标内为0的元素效果是相同的。
3、通过元素列表定义数组
1 2 3 4 5 6 7 8 | #!/bin/bash #通过元素列表定义数组 #定义数组 array=(1 2 3 4 5 6) #输出第4个数组元素的值 echo "The fourth element is ${array[3]}" #输出所有元素的值 echo "The elements of this array are ${array[@]}" |
运行脚本
1 2 3 | [root@docker test ] # sh 20160910-4 The fourth element is 4 The elements of this array are 1 2 3 4 5 6 |
数组的访问或查看
数组访问有若干途径,下面列举常用两种:
1、通过索引值来查看其对应的元素值
1 2 3 4 5 | #!/bin/bash #定义数组 array=(1 2 3) #查看下标为1的元素 echo "the second element is ${array[1]}" |
运行脚本
1 2 | [root@docker test ] # sh 20160910-5 the second element is 2 |
2、通过循环列表遍历数组
我们如果要用for循环的c表达,那么有一个问题需要解决,就是取值范围,而数组中有多少个元素只有定义的人才知道,如果有一个现成的数组,我们在不知道其有多少个元素的情况下如何通过for循环遍历显示?
为此我们需要先知道该数组有多少个元素,在数组里面可以通过${#array[@]}表示
1 2 3 4 5 6 7 8 9 10 | #!/bin/bash #通过循环列表定义数组 #定义数组 array=(one two three four five 6 7 8 9 10) #获取数组长度 length= "${#array[@]}" #通过循环遍历数组 for ((i=0;i<$length;i++)); do echo "${array[$i]}" done |
运行脚本
1 | [root@docker test ] # sh 20160910-6 |
1 2 3 4 5 6 7 8 9 10 | one two three four five 6 7 8 9 10 |
关联数组
“关联数组”是一种具有特殊索引方式的数组。不仅可以通过整数来索引它,还可以使用字符串或者其他类型的值(除了NULL)来索引它
关联数组必须事先声明,否则导致创建关联数组失败
declare -A array声明关联数组
array=([a]=tom [b]=john [c]=3)
如果我们定义下标内是人名其对应的元素为成绩,那么输入指定的人名就可以知道其对应的成绩
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/bin/bash #定义关联数组 declare -A grades #为数组下标指定对应的分数 grades=([tom]=90 [lilei]=88 [rose]=92 [Lucy]=80) #给一个名字 read -p "Give a name : " name_G #判断是否给了内容,若没有则在提示后退出 [ -z $name_G ] && echo "None please select [tom|lilei|rose|Lucy] && exit 1" #根据输入的名字输出对应的分数 case $name_G in tom) echo "tom's grades is ${grades[tom]}" ;; lilei) echo "lilei's grades is ${grades[lilei]}" ;; rose) echo "rose's grades is ${grades[rose]}" ;; Lucy) echo "Lucy's grades is ${grades[Lucy]}" ;; *) echo "please select [tom|lilei|rose|Lucy]" esac |
运行脚本
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [root@docker test ] # sh 20160910-7 Give a name : tom Tom's grades is 90 [root@docker test ] # vim 20160910-7 [root@docker test ] # sh 20160910-7 Give a name : rose rose's grades is 92 [root@docker test ] # sh 20160910-7 Give a name : lilei lilei's grades is 88 [root@docker test ] # sh 20160910-7 Give a name : Lucy Lucy's grades is 80 [root@docker test ] # sh 20160910-7 Give a name : other please select [tom|lilei|rose|Lucy] |
数组的增删合
增加数组个数
1 2 3 4 5 6 7 8 9 10 11 12 13 | #!/bin/bash #定义数组 array=(1 2) #显示数组所有元素 echo "${array[@]}" #显示数组元素个数 echo "${#array[@]}" #追加数组元素 array[2]=3 array[3]=4 #显示追加后的数组信息 echo "${array[@]}" echo "${#array[@]}" |
运行脚本
1 2 3 4 5 | [root@docker test ] # sh 20160910-8 1 2 2 1 2 3 4 4 |
可以从数组的任意未使用的下标数开始。可以非连续增加数组
删除数组
1、删除数组指定某个元素
命令:unset array[n]
1 2 3 4 5 6 7 8 9 10 11 | #!/bin/bash #定义数组 array=(1 2 3) #显示数组所有元素 echo "${array[@]}" #显示下标为0的数组元素 echo "${array[0]}" #删除下标为0的数组元素 unset array[0] echo "${array[@]}" echo "${array[0]}" |
2、删除整个数组
命令:unset array
1 2 3 4 5 6 7 | #!/bin/bash #定义数组 array=(1 2 3) echo "${array[@]}" #删除整个数组 unset array echo "${array[@]}" |
运行脚本
1 2 | [root@docker test ] # sh 20160910-9 1 2 3 |
数组之间的合并
数组可以将多个不同的数组组合成一个新的数组。
数组连接语法如下:
("${array1[@]}" "${array2[@]}" ... "${arrayN[@]}")
数组之间用空格隔开
示例
1 2 3 4 5 6 7 | #定义两个数组 array1=(1 2 3) array2=(4 5 6) #连接数组 array1_2=( "${array1[@]}" "${array2[@]}" ) #显示合并后数组的所有元素 echo "${array1_2[@]}" |
运行脚本
1 2 | [root@docker test ] # sh 20160910-10 1 2 3 4 5 6 |
数组中的切片
所谓切片,是指截取数组的部分元素或某个元素的部分内容
基本语法为:${array[@|*|n]:start:length}
示例1:给定一个长度为8的数组,截取第3个元素开始的4个元素。
1 2 3 4 | #!/bin/bash array=(1 2 3 4 5 6 7 8) var=${array[@]:3:4} echo "$var" |
运行脚本
1 2 | [root@docker test ] # sh 20160910-11 4 5 6 7 |
示例2:给定一个长度为3的数组,截取第2个元素,从该元素的第1个字符开始,截取其中3个字符
1 2 3 4 | #!/bin/bash array=(apple orange banana) var=${array[2]:1:3} echo "$var" |
运行脚本
1 2 | [root@docker test ] # sh 20160910-12 ana |
数组中的替换
数组的替换是指将某个数组元素的部分内容用其他字符串来代替,但不影响原来的数组的值。
基本语法为:${array[@|*]/pattern/replacement}
1 2 3 4 | #!/bin/bash replace=(a b c d e) echo "the replaced array is ${replaced[@]/c/3}" echo "the original array is ${replace[@]}" |
运行脚本
1 2 3 | [root@docker test ] # sh 20160910-13 the replaced array is a b 3 d e the original array is a b c d e |
小结
本文主要讲述数组的概念,数组的定义,数组的查看,关联数组的使用,数组的增删合,数组的切片,数组的替换这7部分内容。
感触:我在总结完数组后,隐隐感觉到数组与数据库之间有一定的关联性。
查看历史可以知道数组诞生于数据库之前,因此我感觉数据库这个思想一定程度上是借鉴了数组的一些理念。当然数据库比数组要强大很多,在数据查询搜索专业许多。可还是觉得这两者之间有种本质上的一致:基于数据之间的对应。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Docker镜像仓库Harbor实践
1,环境安装的软件及版本: linux : version centos7.3 Docker:version 1.12.6 Docker-compose: version 1.13.0 Harbor: version 1.1.2 Harbor是基于docker registry V2版本,所以要求docker版本不小于1.10.0,docker-compose版本不小于1.8.0,centos7 yum安装docker就可以满足版本要求。 2,请自行安装centos7.3系统,设置好网络和防火墙 网络需要能访问外网, vim/etc/sysconfig/network-scripts/ifcfg-eno16777736 TYPE=Ethernet BOOTPROTO=static DEFROUTE=yes PEERDNS=no PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAI...
- 下一篇
Docker跨主机容器互传数据问题及解决方法
目前我这里docker主要使用1.5版本,用途是给研发、运维做测试环境,给游戏与平台业务做生产应用,昨天接到某游戏研发反馈,2个不同宿主机进行数据同步的时候,出现以下错误 orruptedMAConinput. Disconnecting:Packetcorrupt lostconnection 经过谷歌搜索发现问题原因是 "CorruptedMAConinput" Thissituationhappenswhenthepacketisdecrypted,thelengthfieldischecked,theMACiscomputedoverthedecrypteddataandthencheckedagainsttheMACfieldfromtheSSHpacket(seethepictureabove).IfthosetwoMACsdon'tmatchweprintthe"badmac"errormessage. Possiblereasonsfor"CorruptedMAConinput" Ifyouseethosemessagesinsteadofthe"Badpacketle...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8编译安装MySQL8.0.19
- CentOS7,8上快速安装Gitea,搭建Git服务器
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- CentOS7设置SWAP分区,小内存服务器的救世主
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- SpringBoot2整合Redis,开启缓存,提高访问速度