bash shell關聯數組總結


 【原創】本博文為原創博文,引用或轉發請注明原始出處和鏈接:https://www.cnblogs.com/dingbj/p/dict_array.html 

什么是關聯數組?

關聯數組相對於索引數組,又稱字典,這里我就不給具體定義了,可以百度。

通過對比普通索引數組,能夠快速理解運用關聯數組。在定義或者引用索引數組時,通常使用數字下標來索引數組中不同的元素,

而關聯數組最大的差別是,元素是無序的,關聯數組由特定格式的鍵值對組成,關聯數組的鍵是唯一的,同時使用鍵作為下標來索引關聯數組元素。當然,對於無變量類型的腳本語言,數字可以被看做特殊的字串,

也就是說,在關聯數組的索引中,你也可以使用數字作為鍵。

 

定義和初始化關聯數組

    關聯數組初始化賦值方式1

這種情況必須先聲明再初始化,例如:

       declare -A mydict    #聲明

      mydict["name"]=guess

      mydict["old"]=18

      mydict["favourite"]=coconut

 

 關聯數組初始化賦值方式2:

以索引數組格式定義,只不過元素變成了鍵值對,這種方式不需要先聲明,例如:

  mydict=(["name"]=guess ["old"]=18 ["favourite"]=coconut] ["my description"]="I am a student")

 

    也可以聲明並同時賦值: 

  declare -A mydict=(["name"]=guess ["old"]=18 ["favourite"]=coconut ["my description"]="I am a student")

 

    方式2中,和索引數組定義方式一樣,直接在變量賦值語句的等號右側用小括號定義,但括號內部元素格式不同:

        元素格式為:["鍵"]=值,元素鍵值對之間以空格分隔。

  

 

關聯數組的引用

引用某個元素時,和普通數組的區別:只是索引為鍵而已

  例如:echo ${mydict["name"]},輸出為guess

引用整個關聯數組時,和普通數組的引用完全一樣

  例如:echo ${mydict[@]} 或 echo ${mydict[*]}

 

關聯數組的操作

獲取關聯數組長度(元素的個數):

例如:echo ${#mydict[@]}

 

關聯數組切片:

通常,索引數組時有序的,而關聯數組是無序的,雖然關聯數組的切片還是能輸出,但輸出元素的排列順序在不同的電腦上是不相同的,因此建議不要使用分片操作;

 

關聯數組元素值的替換:

echo ${mydict[@]/guess/xiaoli}

 

關聯數組的刪除:

unset mydict

 

獲取關聯數組索引列表:

格式:${!關聯數組名[@或*]

     

    

注意,鍵“my description"在這里看不出是一個字符串整體

 

 對關聯數組元素直接進行運算:

使用let命令對未定義的元素進行算數計算時,默認值為0,例如:

let mydict['one']++

 

 

遍歷關聯數組元素:

 (實際上是對鍵列表進行遍歷,在循環中引用這些鍵)

  同樣需要注意的是,${!mydict[@]}和${!mydict[*]}使用雙引號括住時的差別:

  有@時,雙引號括住能保證元素值有空格的情況下不會出問題,

  而有*時,雙引號括住后將解析為所有索引以空格分隔的字符串,如果再把這個字符串作為循環體中操作關聯數組的索引,輸出肯定為空。

  當不使用引號括住時,只能針  對無空格的元素值才能表現正常,因此,遍歷時通常使用有@的格式,並用雙引號括住。

    例如:

    

 

    錯誤用法舉例:

    (有@或*,但沒有雙引號括住時,

${!mydict[*]}輸出的是沒有引號的鍵的列表,for解析時將有空格的”my description“鍵拆分為my和description,

但mydict根本就沒定義這兩個鍵,因此遍歷時輸出兩個空行)

    

    

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM