【原創】本博文為原創博文,引用或轉發請注明原始出處和鏈接: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根本就沒定義這兩個鍵,因此遍歷時輸出兩個空行)