Shell从入门到精通教学课件:第7章 数组_第1页
Shell从入门到精通教学课件:第7章 数组_第2页
Shell从入门到精通教学课件:第7章 数组_第3页
Shell从入门到精通教学课件:第7章 数组_第4页
Shell从入门到精通教学课件:第7章 数组_第5页
已阅读5页,还剩52页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第7章数组本章主要涉及到的知识点有:定义数组:主要介绍在Shell中定义数组变量的各种方法,包括通过指定元素值来定义数组,通过declare语句定义数组,通过元素值集合定义数组,通过键值对定义数组以及通过字符串定义数组等。数组的赋值:主要介绍如何为数组元素赋值,包括通过循环为数组元素赋值,通过索引为数组元素赋值,通过集合为数组元素赋值以及在数组末尾追加新元素等。访问数组:主要介绍数组元素的访问方法,包括如何访问数组的第1个元素,通过索引访问数组元素,计算数组长度,通过循环遍历数组元素,以字符串的形式输出所有的数组元素,以切片方式获取部分数组元素以及数组元素的替换等。删除数组:介绍如何销毁数组变量,包括删除某个指定的数组元素以及删除整个数组等。数组的其他操作:主要包括数组的复制,数组的连接以及如何从文本文件中加载数据到数组等。7.1定义数组所谓数组,是指将具有相同类型的若干变量按照一定的顺序组织起来的一种数据类型。Shell语言对于数组的支持非常强大。在Shell中,用户可以通过多种方式来创建一个数组。为了能够使读者充分了解数组的创建方法,本节将介绍其中最常用的几种数组定义方法。7.1.1通过指定元素值来定义数组在Shell中,用户可以通过直接指定数组中的元素值来定义一个新的数组变量,其基本语法如下:array[key]=value在上面的语法中,array表示数组变量的名称,key参数表示数组元素的索引,通常是一个整数值,value表示key所对应的数组元素的值。通过以上语句,用户可以定义了名称为array的新数组变量。【例7-1】演示如何通过直接指定元素值来定义数组#!/bin/bash#指定数组元素值array[1]=onearray[3]=three#输出数组元素echo"${array[@]}"[root@linuxchapter7]#./ex7-1.shonethree7.1.2通过declare语句定义数组declare语句除了可以用来声明变量之外,还可以用来定义数组。在使用该语句定义数组时,其基本语法如下:declare-aarray在上面的语法中,-a选项表示后面定义的是一个数组,其名称为array。#!/bin/bash#定义数组declare-aarray#为元素赋值array[0]=1array[1]=2#输出元素值echo"${array[@]}"[root@linuxchapter7]#./ex7-2.sh12【例7-2】演示如何通过declare语句来声明数组7.1.3通过元素值集合定义数组在某些情况下,用户可能需要一次性为数组的所有元素都提供一个值。此时,用户可以以元素值集合的形式来定义数组,其基本语法如下:array=(v0v1v2...vn)在上面的语法中,array表示数组名称,等号后面的是所有的元素值的集合,这些值按照一定的顺序来排列,之间用空格隔开。最后,所有的值用圆括号括起来。Shell会将这些值从下标为0的第1个元素开始,依次将这些值赋给数组的所有元素。另外,在上面的语法中,用户并没有显示指定数组元素的具体个数。在这种情况下,数组元素的个数与值的个数相同。#!/bin/bash#定义数组array=(12345678)#输出第1个数组元素的值echo"thefirstelementis${#array[0]}"#输出所有元素的值echo"theelementsofthisarrayare${array[@]}"#输出数组长度echo"thesizeofthearrayis${#array[@]}"[root@linuxchapter7]#./ex7-3.shthefirstelementis1theelementsofthisarrayare12345678thesizeofthearrayis8【例7-3】演示如何通过元素值集合来创建数组变量7.1.4通过键值对定义数组当用户需要定义索引不连续的数组时,需要显示指定要赋值的数组元素,也就是要为哪个数组元素指定值。此时,用户可以使用键值对的方式来定义数组,其基本语法如下:array=([0]=value0[1]=vlaue1[2]=value2...[n]=valuen)在上面的语法中,等号左边的array表示数组名,等号右边的圆括号表示数组元素及其值。其中方括号里面的数字表示数组元素的索引(下标),value0、value1、value2…valuen表示所对应的元素的值。每个索引和值组成一个键值对,键和值之间用等号隔开。当通过键值对定义数组时,用户所提供的键值对中的元素索引不一定是连续的,可以任意指定要赋值的元素的索引。之所以可以这样操作,是因为用户已经显式指定了索引,Shell就可以知道值和索引的对应关系。#!/bin/bash#定义数组array=([1]=one[4]=four)#输出数组长度echo"thesizeofthearrayis${#array[@]}"#输出索引为4的元素的值echo"thefourthelementis${array[4]}"[root@linuxchapter7]#./ex7-4.shthesizeofthearrayis2thefourthelementisfour【例7-4】演示通过键值对定义数组的方法#!/bin/bash#声明数组declare-Aarray#为数组赋值array=([flower]=rose[fruit]=apple)#输出第1个元素的值echo"thefloweris${array[flower]}"#输出第2个元素的值echo"thefruitis${array[fruit]}"#输出数组长度echo"thesizeofthearrayis${#array[@]}"[root@linuxchapter7]#./ex7-5.shtheflowerisrosethefruitisapplethesizeofthearrayis2【例7-5】演示关联数组的使用方法7.1.5数组和普通变量在Shell中,所有的普通变量实际上都可以当作是数组变量来使用。对普通变量操作与对相同名称的下标为0的元素的操作是等效的。#!/bin/bash#定义字符串变量array="hello,world."#输出下标为0的元素的值echo"${array[0]}"#输出所有元素的值echo"${array[@]}"#输出所有元素的值echo"${array[*]}"[root@linuxchapter7]#./ex7-6.shhello,world.hello,world.hello,world.【例7-6】演示如何将普通变量作为数组来处理7.2数组的赋值当用户定义好数组之后,就可以用它来存储数据了。这就需要为数组赋值。数组的赋值与普通变量的赋值有许多不同之处,本节将介绍如何在Shell中为数组赋值。7.2.1按索引为元素赋值在Shell中,为数组元素赋值有2种基本的方法,分别是按索引赋值和以集合的形式赋值。其中,按索引赋值是最基本的赋值方法,其基本语法如下:array[n]=valuen其中,array是数组名称,方括号里面的n表示元素的索引,等号右边的valuen表示元素n的值。以上语法表示将索引为n的元素的值赋为valuen。#!/bin/bash#定义数组students=(JohnRoseTomTim)#输出元素值echo"theoldstudentsare:${students[*]}"#改变第1个元素的值students[0]=Susan#改变第4个元素的值students[3]=Jack#输出数组新的值echo"thenewstudentsare:${students[*]}"#声明关联数组declare-Agrades#初始化新的数组grades=([john]=90[rose]=87[tim]=78[tom]=85[jack]=76)#输出数组元素值echo"theoldgradesare:${grades[@]}"#改变Tim的分数grades[tim]=84#重新输出数组元素值echo"thenewgradesare:${grades[@]}"【例7-7】演示通过索引来为数组赋值的方法[root@linuxchapter7]#./ex7-7.shtheoldstudentsare:JohnRoseTomTimthenewstudentsare:SusanRoseTomJacktheoldgradesare:7887768590thenewgradesare:84877685907.2.2通过集合为数组赋值

通过集合为数组赋值与通过集合定义数组的语法完全相同。当为某个数组提供一组值时,Shell会从第1个元素开始,依次将这些值赋给每个元素。当新的值的个数超过原来的数组长度时,Shell会在数组末尾追加新的元素;当新的值的个数少于原来的数组长度时,Shell会将新的值从第1个元素开始赋值,然后删除超出的元素。#!/bin/bash#定义数组a=(abcdef)#输出所有元素的值echo"${a[@]}"#为数组元素重新赋值a=(hijkl)#输出所有元素的值echo"${a[@]}"#为数组元素重新赋值a=(mn)echo"${a[@]}"[root@linuxchapter7]#./ex7-8.shabcdefhijklmn【例7-8】演示通过集合为数组元素赋值的方法7.2.3在数组末尾追加新元素

在Shell中,向已有的数组末尾追加新的元素非常方便。在通过索引为数组元素赋值时,如果指定的索引不存在,则Shell会自动添加一个新的元素,并且将指定的值赋给该元素。#!/bin/bash#定义数组array=(12)#输出数组echo"${array[@]}"#向数组末尾追加元素array[2]=3array[3]=4echo"${array[@]}"[root@linuxchapter7]#./ex7-9.sh121234【例7-9】演示如何在数组末尾追加新的数组元素【例7-10】演示向关联数组追加新元素的方法#!/bin/bash#定义数组declare-Aarray#初始化数组array=([a]=a[b]=b)echo"theoldelementsare${array[@]}"#向数组追加元素array[c]=cecho"thenewelementsare${array[@]}"[root@linuxchapter7]#./ex7-10.shtheoldelementsareabthenewelementsareabc7.2.4通过循环为数组元素赋值在实践中,最常用的数组赋值方法是通过一个循环语句来逐个为每个元素提供值。这个循环语句可以是前面介绍的任意一种循环语句,例如for、while或者until等。#!/bin/bash#通过循环为数组赋值foriin{1..10}doarray[$i]=$idone#输出元素的值echo"${array[@]}"[root@linuxchapter7]#./ex7-11.sh12345678910【例7-11】演示为数组元素逐个赋值的方法7.3访问数组当用户将数据存储到数组之后,下一步就是如何读取这些数组元素的值。对于数组的读取操作,Shell也提供了许多非常灵活的手段。本节将介绍如何访问数组元素。7.3.1访问第1个数组元素

此处所指的第1个数组元素,是指下标为0的元素。前面已经介绍过,所有的普通变量都可以当作是数组变量来处理。当用户对普通变量进行赋值操作时,与对同名数组中下标为0的第1个数组元素的操作效果是相同的。在Shell中,当直接使用数组名来访问数组时,得到的是下标为0的元素的值。【例7-12】演示通过数组名访问第1个元素的值#!/bin/bash#定义数组array=(12345)#通过数组名访问数组echo"${array}"[root@linuxchapter7]#./ex7-12.sh17.3.2通过下标访问数组元素与其他的程序设计语言一样,通常情况下,访问数组中某个具体的元素都是通过下标来指定的,其基本语法如下:array[n]其中array表示数组名称,n表示下标。在Shell中,下标从0开始,因此,第1个数组元素是array[0]。如果数组的长度为n,则最后一个元素的下标为n-1。#!/bin/bash#定义数组array=(MonTueWedThuFriSatSun)#输出下标为0的元素echo"thefirstelementis${array[0]}"#输出下标为3的元素echo"thefourthelementis${array[3]}"[root@linuxchapter7]#./ex7-13.shthefirstelementisMonthefourthelementisThu【例7-13】演示如何通过下标来访问数组的元素7.3.3计算数组的长度

在Shell中,用户可以通过特殊操作符$#来获得数组长度。该操作符的基本语法如下:${#array[@]}或者${#array[*]}在上面的语法中,array表示数组名称,方括号中的@或者*是通配符,表示匹配所有的元素。【例7-14】演示如何使用$#操作符来获取数组长度#!/bin/bash#定义数组array=(MonTueWedThuFriSatSun)#输出数组长度echo"thelengthofthearrayis${#array[@]}"[root@linuxchapter7]#./ex7-14.shthelengthofthearrayis7【例7-15】演示如何通过$#操作符获取某个数组元素的长度#!/bin/bash#定义数组linux[0]="Debian"linux[1]="RedHat"linux[2]="Ubuntu"linux[3]="Suse"#输出第4个元素echo"thefourthelementis${linux[3]}"#输出第4个元素的值echo"thelengthofthefourthelementis${#linux[3]}"#输出第1个元素的值echo"thefirstelementis${linux}"#输出第1个元素的长度echo"thelengthofthefirstelementis${#linux}"[root@linuxchapter7]#./ex7-15.shthefourthelementisSusethelengthofthefourthelementis4thefirstelementisDebianthelengthofthefirstelementis67.3.4通过循环遍历数组元素

在程序设计时,数组的遍历是一个极其常见的操作。通常情况下,用户需要使用循环结构来实现数组元素的遍历。【例7-16】演示如何通过for循环结构来遍历数组#!/bin/bash

#定义数组array=(MonTueWedThuFriSatSun)#通过下标访问数组foriin{0..6}doecho"${array[$i]}"done[root@linuxchapter7]#./ex7-16.shMonTueWedThuFriSatSun【例7-17】本例对【例7-16】中的算法进行改进#!/bin/basharray=(MonTueWedThuFriSatSun)#获取数组长度len="${#array[@]}"#通过循环结构遍历数组for((i=0;i<$len;i++))doecho"${array[$i]}"done[root@linuxchapter7]#./ex7-16.shMonTueWedThuFriSatSun7.3.5引用所有的数组元素

在Shell脚本中,用户可以通过多种不同的方法来输出整个数组。前面介绍过,用户可以通过下标来访问某个具体的数组元素。但是,如果用户指定下标为@或者*,则表示引用当前数组中的所有的元素。其中,符号@或者*称为通配符,表示匹配所有的元素。【例7-18】演示通过通配符引用数组元素的方法#!/bin/basharray=(MonTueWedThuFriSatSun)#通过循环输出所有的数组元素forein"${array[@]}"doecho"$e"done[root@linuxchapter7]#./ex7-18.shMonTueWedThuFriSatSun7.3.6以切片方式获取部分数组元素

所谓切片,是指截取数组的部分元素或者某个元素的部分内容。例如,指定一个具体的数组,截取从第2个元素开始的5个元素。或者,截取某个数组中指定元素的前几个字符。用户可以像获取数组元素的值一样来获取数组的某个切片。获取切片的基本语法如下:${array[@|*]:start:length}在上面的语法中,array表示数组名称,方括号中的符号@和*的涵义与前面介绍的完全相同,都是通配符,表示匹配所有的数组元素,两者只能选择一个。start参数表示起始元素的下标,下标永远从0开始。length表示要截取的数组元素的个数。通过以上切片,用户得到的是一个空格隔开的多个元素值组成的字符串。【例7-19】演示如何进行数组切片#!/bin/bashlinux=("Debian""RedHat""Ubuntu""Suse""Fedora""UTS""CentOS")#数组切片echo${linux[@]:2:4}[root@linuxchapter7]#./ex7-19.shUbuntuSuseFedoraUTS【例7-20】演示将切片结果赋给变量的方法#!/bin/bashlinux=("Debian""RedHat""Ubuntu""Suse""Fedora""UTS""CentOS")#将切片结果赋给一个变量var=${linux[@]:2:4}echo"$var"[root@linuxchapter7]#./ex7-20.shUbuntuSuseFedoraUTS【例7-21】演示将切片结果以数组形式保存的方法#!/bin/bash#定义数组linux=("Debian""RedHat""Ubuntu""Suse""Fedora""UTS""CentOS")#切片array=(${linux[@]:2:4})#获取新的数组的长度length="${#array[@]}"#输出数组长度echo"thelengthofnewarrayis$length"#通过循环输出各个元素for((i=0;i<$length;i++))doecho"${array[$i]}"done[root@linuxchapter7]#./ex7-21.shthelengthofnewarrayis4UbuntuSuseFedoraUTS【例7-22】演示如何对数组元素进行切片#!/bin/bashlinux=("Debian""RedHat""Ubuntu""Suse""Fedora""UTS""CentOS")#对数组元素切片str=(${linux[4]:2:4})#输出切片结果echo"$str"[root@linuxchapter7]#./ex7-22.shdora7.3.7数组元素的替换在Shell中,用户还可以对数组进行另外一种特殊的操作,称为数组元素的替换。所谓替换,是指将某个数组元素的部分内容用其他的字符串来代替,但是并不影响原来的数组的值。数组元素替换的基本语法如下:${array[@|*]/pattern/replacement}在上面的语法中,array表示要操作的数组名称,pattern参数表示要搜索的字符串,replacement参数表示用来替换的字符串。【例7-23】演示如何对数组进行替换,以及如何将替换的结果赋给一个新的数组变量#!/bin/bash#定义数组a=(12345)#输出替换结果echo"theresultis${a[@]/3/100}"#输出原始数组echo"theoldarrayis${a[@]}"#将替换结果赋给一个数组变量a=(${a[@]/3/100})#输出新的数组变量的值echo"thenewarrayis${a[@]}"[root@linuxchapter7]#./ex7-23.shtheresultis1210045theoldarrayis12345thenewarrayis12100457.4删除数组当某个数组变量不再需要时,用户可以将其删除,从而释放相应的内存。用户可以删除整个数组,也可以删除其中的数组元素。本节将介绍如何对数组或者元素进行删除。7.4.1删除指定数组元素与删除其他的Shell变量一样,用户可以使用unset命令来删除某个数组元素,其基本语法如下:unsetarray[n]在上面的语法中,array表示数组名称,n表示要删除的数组元素的下标,从0开始计算。#!/bin/bashlinux=("Debian""RedHat""Ubuntu""Suse""Fedora""UTS""CentOS")输出原始数组长度echo"thelengthoforiginalarrayis${#linux[@]}"#输出数组的原始值echo"theoldarrayis${linux[@]}"#删除下标为3的元素unsetlinux[3]输出新的数组的长度echo"thelengthofnewarrayis${#linux[@]}"#输出新的数组的值echo"thenewarrayis${linux[@]}"【例7-24】演示如何删除数组元素[root@linuxchapter7]#./ex7-24.shthelengthoforiginalarrayis7theoldarrayisDebianRedHatUbuntuSuseFedoraUTSCentOSthelengthofnewarrayis6thenewarrayisDebianRedHatUbuntuFedoraUTSCentOS7.4.2删除整个数组如果某个数组不再需要了,用户同样可以使用unset命令来将其删除,基本语法如下:unsetarray其中,array表示要删除的数组的名称。#!/bin/bash

linux=("Debian""RedHat""Ubuntu""Suse""Fedora""UTS""CentOS")#删除整个数组unsetlinuxecho"${linux[@]}"[root@linuxchapter7]#./ex7-25.sh

【例7-25】演示如何删除整个数组7.5数组的其他操作Shell的数组还提供了许多其他的操作,例如数组的复制、数组的连接以及从文本文件中加载数据到数组,对于用户来说,这些操作也非常重要,本节将详细介绍这操作的实现方法。7.5.1复制数组所谓复制数组,是指创建一个已经存在的数组的副本。也就是将一个数组的内容全部存储到另外一个新的数组中。在Shell中,用户可以通过以下语法来实现数组的复制:newarray=("${array[@]}")其中,newarray表示新的数组,array表示已有的数组。同样,其中的@表示匹配所有的数组元素。右边最外层是一对圆括号。#!/bin/bashlinux=("Debian""RedHat""Ubuntu""Suse""Fedora""UTS""CentOS")#复制数组linu

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论