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

提交評論