1. 索引數組 一、什麼是索引數組? 所謂索引數組就是普通數組,以整數作為數組元素的索引下標。 二、實例。 備註: (a)使用-a選項定義索引數組,使用一對小括弧()定義數組中的元素列表。 (b)索引數組使用整數作為數組元素下標。 備註: (a)使用@和*作為數組下標,表示獲取所有元素。 三、實例。 ...
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