1. 索引陣列
一、什么是索引陣列?
所謂索引陣列就是普通陣列,以整數作為陣列元素的索引下標,
二、實體,

備注:
(a)使用-a選項定義索引陣列,使用一對小括號()定義陣列中的元素串列,
(b)索引陣列使用整數作為陣列元素下標,
備注:
(a)使用@和*作為陣列下標,表示獲取所有元素,
三、實體,

備注:
(a)${#a[@]}和${#a[*]}都表示計算陣列長度,也就是元素的數量,
四、實體,

備注:
(a)直接使用陣列下標索引來修改陣列中指定的元素,
五、實體,

備注:
(a)陣列使用感嘆號獲取陣列中所有已存在的元素的索引下標,
下載Linux Bash Shell免費教程PDF檔案:
點擊此處下載 補天云C_CPP_QT工程師的Linux_Bash_Shell免費教程_V1.0.zip
2. 關聯陣列
一、什么是關聯陣列?
所謂關聯素組指的是使用普通字串作為陣列下標,每一個元素形成一個鍵值對,也就是key-value,
二、實體,

備注:
(a)使用大寫的-A選項配合小括號()定義關聯陣列,
(b)這個例子中使用字串a作為鍵值對的key,Butianyun作為鍵值對的value,以此類推,
(c)關聯陣列也可以正常使用感嘆號獲取所有的索引下標,正常使用#這個符號獲取陣列的長度,
下載Linux Bash Shell免費教程PDF檔案:
點擊此處下載 補天云C_CPP_QT工程師的Linux_Bash_Shell免費教程_V1.0.zip
3. 稀疏陣列
一、什么是稀疏陣列?
所謂稀疏陣列是指整數作為陣列索引下標時,所有的索引下標按照從小到大排序之后在數值上并不連續的陣列,因為有一些索引下標對應的元素并不存在,
二、實體,

備注:
(a)這個例子中先定義了一個空的索引陣列,然后直接對某一些索引序號對應的元素賦值,自然而然的創建了一個稀疏陣列,
(b)索引陣列中元素的排列次序是按照索引下標的整數從小到大排序的,
三、實體,

備注:
(a)索引陣列也是支持直接在小括號內使用中括號指定每一個元素的索引下標,
四、實體,

備注:
(a)思考:
問題:這個陣列a是索引陣列還是關聯陣列?
答案:索引陣列,原因:使用-a選項只能定義索引陣列,
(b)如果在后面指定的索引下標跟前面的重復了,那么后面的索引下標對應的元素會覆寫掉前面的元素,效果上相當于前面的元素沒有出現一樣,
下載Linux Bash Shell免費教程PDF檔案:
點擊此處下載 補天云C_CPP_QT工程師的Linux_Bash_Shell免費教程_V1.0.zip
4. 關聯陣列的元素排列次序
一、實體,

備注:
(a)思考:
問題:這個陣列a是稀疏陣列嗎?
答案:不是,原因:使用大寫的-A選項定義的是關聯陣列,
(b)如果使用關聯陣列,可以看到運行結果與索引陣列完全不同,
(c)關聯陣列中的元素的排列既沒有按照索引下標排序,不是按整數排序,也不是按字串排序;也不是按照定義陣列時元素出現的次序排序,排列次序看起來似乎是雜亂無章的,
二、實體,

備注:
(a)可以看到既不是按照鍵值對的key排序,也沒有按照鍵值對的value排序,
(b)思考:
問題:為什么關聯陣列的元素排列出現這種看起來雜亂無章的排列次序?
答案:關聯陣列內部使用哈希技術,根據哈希的特性,key的次序無法決定key的哈希值的次序,
三、實體,

備注:
(a)對于這種只有一個字母作為key的關聯陣列,元素的排列次序看起來好像是有規律的,實際上卻是是有規律的,
(b)下面使用隨機化產生的關聯陣列來解釋這種規律,
butianyun.sh腳本檔案:


備注:
(a)總結:對于這種索引下標只有一個字母或數字的關聯陣列,元素排列次序有規律:
規律1:字母作為索引的,按照索引下標的ASCII碼次序從大到小排列,也就是正常ASCII碼次序的逆序排列,
規律2:數字作為索引的,按照索引下標的ASCII次序從大到小排列,
規律3:數字作為索引的元素排在字母作為索引的元素的前面,
(b)對于這種情況,元素排列次序并不能說成是按照ASCII次序從大到小排列,而是先把數字和字母分成了兩大類,

備注:
(a)如果key不是一個字符,而是兩個字符或更多字符,則沒有這種規律了,
(b)下面這個例子更好的證明了這一點,
butianyun.sh腳本檔案:



備注:
(a)隨機化產生的關聯陣列,索引下標是兩個字母或數字,這時元素的排列次序就沒有規律,而是取決于key的哈希值,
下載Linux Bash Shell免費教程PDF檔案:
點擊此處下載 補天云C_CPP_QT工程師的Linux_Bash_Shell免費教程_V1.0.zip
5. @和*的異同點
一、實體,

備注:
(a)陣列a總共有三個元素,第二個元素包含一個空格,
(b)在這個例子中,使用@和 *并沒有什么區別,
(c)不管使用@還是*,陣列a的長度都是3,

備注:
(a)在這個例子中,使用@和*也沒有什么區別,
(b)思考:
問題:為什么在把陣列a的元素全部放置到陣列b和c中之后,b和c的陣列長度都是4呢?
答案:代碼中對b和c的賦值,等效于如下代碼,

備注:
(a)bash shell對命令列的引數的決議程序中,有一個去掉雙引號的程序,相當于這些字串都沒有加雙引號,所以就會被認為有四個元素,
二、實體,

備注:
(a)在對陣列b和c賦值時,小括號()中加了雙引號,使用@和*的效果就有了很大的區別,
(b)思考:
問題:為什么使用@之后陣列b有3個元素,而使用*之后陣列c只有1個元素?
答案:這跟bash shell對”${a[@]}”和”${a[*]}”的規定有關,
在bash shell中,把”${a[@]}”展開之后相當于將陣列a的每一個元素加上雙引號之后形成一個串列,

備注:
(a)這個例子解釋了為什么陣列b有三個元素,”Linux Bash”這個字串在a中作為一個元素,在b中還是作為一個元素看待,
在bash shell中,把”${a[*]}”展開之后相當于將陣列a的每一個元素形成一個串列之后再整體上加雙引號,這樣自然就只有一個元素了,

備注:
(a)這個例子解釋了為什么陣列c只有一個元素,”Butianyun Linux Bash Shell”這個字串整體在c中作為一個元素看待,
三、實體,
理解@和*的區別有什么價值呢?下面討論在for回圈中的應用,

備注:
(a)陣列a本身只有三個元素,第二個元素包含空格,
(b)在不加雙引號時,不管使用@還是*,回圈體都是執行四次,
(c)陣列a的第二個元素”Linux Bash”被拆分成兩個獨立的詞語,

備注:
(a)在使用@并且加了雙引號之后,回圈體只執行了三次,陣列a的第二個元素并沒有被拆分,
加雙引號之后,相當于陣列a的每一個元素加上雙引號之后形成了一個串列,

備注:
(a)在使用*并且加了雙引號之后,回圈體只執行了一次,陣列a的所有元素形成一個串列之后再加雙引號,相當于陣列a的所有元素合并成了一個整體,
下載Linux Bash Shell免費教程PDF檔案:
點擊此處下載 補天云C_CPP_QT工程師的Linux_Bash_Shell免費教程_V1.0.zip

轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/511875.html
標籤:Linux
上一篇:獲取字串中所有數字的陣列
