經常使用的 Bash Shell 只支持一維數組,不支持多維數組。html
Shell 而且沒有限制數組的大小,理論上能夠存放無限量的數據。Shell 數組元素的下標也是從 0 開始計數。shell
在 Shell 中,用括號( )
來表示數組,數組元素之間用空格
來分隔。由此,定義數組的通常形式爲:數組
array_name=(ele1 ele2 ele3 ... elen)
注意
,賦值號=
兩邊不能有空格,必須緊挨着數組名和數組元素。bash
下面是一個定義數組的實例:.net
nums=(3 13 23 33 43 53)
Shell 是弱類型
的,它並不要求全部數組元素的類型必須相同,例如:code
arr=(3 30 "小小")
第三個元素就是一個「異類」,前面兩個元素都是整數,而第三個元素是字符串。htm
Shell 數組的長度不是固定的,定義以後還能夠增長元素。
例如,對於上面的 nums 數組,它的長度是 6,使用下面的代碼會在最後增長一個元素,使其長度擴展到 7:blog
nums[6]=88
此外,你也無需逐個元素地給數組賦值
,下面的代碼就是隻給特定元素賦值:字符串
ages=([3]=24 [5]=19 [10]=12)
以上代碼就只給第 三、五、10 個元素賦值,因此數組長度是 3。其它位置都是取不到值的。get
獲取數組元素的值,通常使用下面的格式:
${array_name[index]} #其中,array_name 是數組名,index 是下標
例如:
n=${nums[2]} #表示獲取 nums 數組的第二個元素,而後賦值給變量 n。
例如:
echo ${nums[3]} #直接輸出 nums 數組的第 3 個元素
使用@
或*
能夠獲取數組中的全部元素
${nums[*]} ${nums[@]} #二者均可以獲得 nums 數組的全部元素。
示例
,建立array.sh
#!/bin/bash nums=(3 28 30 62 65) echo ${nums[@]} #輸出全部數組元素 nums[10]=100 #給第10個元素賦值(此時會增長數組長度) echo ${nums[*]} #輸出全部數組元素 echo ${nums[4]} #輸出第4個元素 echo ${nums[10]} #輸出第10個元素
運行腳本 bash array.sh
3 28 30 62 65 3 28 30 62 65 100 65 100
利用@
或*
,能夠將數組擴展成列表,而後使用#
來獲取數組元素的個數,格式以下:
${#array_name[@]} ${#array_name[*]} # 其中 array_name 表示數組名。兩種形式是等價的,選擇其一便可。
示例
,建立array1.sh
#!/bin/bash nums=(3 28 30) echo ${#nums[*]} #向數組中添加元素 nums[6]="爺爺64歲" echo ${#nums[@]} #刪除數組元素 unset nums[1] echo ${#nums[*]}
運行腳本
3 4 3
思路
:先利用@
或*
,將數組擴展成列表,而後再合併到一塊兒。
array_new=(${array1[@]} ${array2[@]}) #兩種方式是等價的,選擇其一便可。 array_new=(${array1[*]} ${array2[*]}) #array1 和 array2 是須要拼接的數組
示例
建立array2.sh
#!/bin/bash array1=(3 28) array2=(30 "小小3歲,媽媽28,爸爸30") array_new=(${array1[@]} ${array2[*]}) #合併數組 echo ${array_new[@]} #也能夠寫做 ${array_new[*]}
運行腳本 bash array2.sh
3 28 30 小小3歲,媽媽28,爸爸30
unset
使用 unset 關鍵字來刪除數組元素。
unset array_name[index] #array_name 表示數組名,index 表示數組下標 unset array_name #若是不寫下標那麼就是刪除整個數組,全部元素都會消失。
示例
建立array3.sh
#!/bin/bash arr=(0 1 2 3) unset arr[1] echo ${arr[@]} unset arr echo ${arr[*]}
運行腳本
0 2 3 #這裏空行,它表示什麼也沒輸出,由於數組被刪除了,因此輸出爲空
理解
:咱們正常的數組都是經過下標0~N來獲取指定元素。而Shell關聯數組(下標是字符串的數組)。
關聯數組
也稱爲「鍵值對(key-value)」數組,鍵(key)也即字符串形式的數組下標,值(value)也即元素值。
注意
關聯數組是在bash4.0之後版本纔有,因此先看下本身bash版本:bash —version
,若是不是就要升級
相關博客:Mac升級bash到最新版本
例如,咱們能夠建立一個叫作 color 的關聯數組,並用顏色名字做爲下標。
declare -A color color["red"]="#ff0000" color["green"]="#00ff00" color["blue"]="#0000ff"
也能夠在定義的同時賦值:
declare -A color=(["red"]="#ff0000", ["green"]="#00ff00", ["blue"]="#0000ff")
不一樣於普通數組,關聯數組必須使用帶有-A
選項的 declare 命令建立。
訪問關聯數組元素的方式幾乎與普通數組相同,具體形式爲:
array_name["index"]
例如:
color["white"]="#ffffff" color["black"]="#000000"
加上$()
便可獲取數組元素的值:
$(array_name["index"])
例如:
echo $(color["white"]) white=$(color["black"])
使用下面的形式能夠得到關聯數組的全部元素值:
${array_name[@]} ${array_name[*]}
使用下面的形式能夠獲取關聯數組的全部下標值:
${!array_name[@]} ${!array_name[*]}
使用下面的形式能夠得到關聯數組的長度:
${#array_name[*]} ${#array_name[@]}
示例
建立array5.sh
#!/bin/bash declare -A color color["red"]="#ff0000" color["green"]="#00ff00" color["blue"]="#0000ff" #獲取全部元素值 for value in ${color[*]} do echo $value done echo "****************" #獲取全部元素下標(鍵) for key in ${!color[*]} do echo $key done echo "****************" #列出全部鍵值對 for key in ${!color[@]} do echo "${key} -> ${color[$key]}" done
運行結果(說明 這裏並無親測,由於個人bash是3.2.7版本,暫不支持關聯數組,後期升級bash)
#ff0000 #0000ff #ffffff **************** red blue white **************** red -> #ff0000 blue -> #0000ff white -> #ffffff
只要本身變優秀了,其餘的事情纔會跟着好起來(少將16)