數組簡介 在bash腳本編程當中,變數是存儲單個元素的記憶體空間;而數組是存儲多個元素的一段連續的記憶體空間。 數組由數組名和下標構成,如下。 ARRAY_NAME[SUBSCRIPT] 數組按照下標的類型可分為兩種: 索引(indexed)數組:下標為0、1、2等非負整數。 關聯(associativ ...
數組簡介
在bash腳本編程當中,變數是存儲單個元素的記憶體空間;而數組是存儲多個元素的一段連續的記憶體空間。
數組由數組名和下標構成,如下。
ARRAY_NAME[SUBSCRIPT]
數組按照下標的類型可分為兩種:
- 索引(indexed)數組:下標為0、1、2等非負整數。
- 關聯(associative)數組:下標為用戶自定義的字元串。
數組的操作
聲明
索引數組可以不聲明直接使用;而關聯數組如果不聲明直接使用的話,會被認為是索引數組,即使它的下標是字元串。
索引數組的聲明方式。
# declare -a ARRAY_NAME
關聯數組的聲明方式。
# declare -A ARRAY_NAME
賦值
一次只賦值一個元素。
# ARRAY_NAME[SUBSCRIPT]=VALUE
一次賦值全部元素。
# ARRAY_NAME = ("VAL1" "VAL2" "VAL3" ...)
一次賦值多個可以是不連續的元素。
# ARRAY_NAME = ([0] = "VAL1" [3] = "VAL3")
像這種不要求元素必須依次存在的數組(即可以在沒有A[1]和A[2]的時候就賦值A[3]),叫做稀疏格式數組。因此,bash支持稀疏格式的數組。
讀取標準輸入賦值數組。
# read -a ARRAY_NAME
在輸入的時候,以空格作為元素的分隔符,以回車鍵結束元素的賦值。
向數組的末尾追加元素。
ARRAY_NAME[${#ARRAY_NAME[@]}]=VALUE
或者
ARRAY_NAME+=(VALUE)
引用
引用單個數組元素。
${ARRAY_NAME[SUBSCRIPT]}
如果省略SUBSCRIPT,那麼就等同於SUBSCRIPT=0。即以下兩個引用是相同的。
${ARRAY_NAME[0]} ${ARRAY_NAME}
引用數組的所有元素。正常情況下,二者沒有區別,只有當被雙引號包裹的時候,“@”被展開為每個元素為一個獨立的單詞;“*”被展開為所有元素為一個統一的單詞。
${ARRAY_NAME[@]}
${ARRAY_NAME[*]}
引用數組元素的長度。
${#ARRAY_NAME[SUBSCRIPT]}
引用數組的長度,即數組的元素個數。
${#ARRAY_NAME[@]}
${#ARRAY_NAME[*]}
引用數組的部分元素(切片)。
${ARRAY_NAME[@]:OFFSET:NUMBER}
${ARRAY_NAME[*]:OFFSET:NUMBER}
OFFSET:偏移,表示偏移/跳過數組中的前幾個元素。
NUMBER:表示偏移後取幾個元素。
如果省略了NUMBER,並且OFFSET的值為“ -n”(註意,-n的左邊有空格),則表示引用倒數的幾個元素。
截止目前我們引用的都是數組的值,如果我們想引用數組的下標的話,可以使用:
${!ARRAY_NAME[@]}
${!ARRAY_NAME[*]}
刪除
刪除數組元素。
# unset ARRAY_NAME[SUBSCRIPT]
刪除數組。
# unset ARRAY_NAME
數組示例
定義一個索引數組,逐一賦值數組元素。
[root@c7-server ~]# declare -a my_array [root@c7-server ~]# my_array[0]=zhang [root@c7-server ~]# my_array[1]=wen [root@c7-server ~]# my_array[2]=long
根據數組下標獲取數組元素。留意我們上文說的,當引用數組不帶下標的時候,等同於引用${ARRAY_NAME[0]}。
[root@c7-server ~]# echo ${my_array} zhang [root@c7-server ~]# echo ${my_array[0]} zhang [root@c7-server ~]# echo ${my_array[1]} wen [root@c7-server ~]# echo ${my_array[2]}
引用數組中的所有元素,順便測試一下“@”和“*”的區別。註意,這個區別,僅在${my_array[@]}或者${my_array[*]}被雙引號包裹的情況下才會出現。
[root@c7-server ~]# echo ${my_array[@]} zhang wen long [root@c7-server ~]# echo ${my_array[*]} zhang wen long [root@c7-server ~]# for i in "${my_array[@]}"; do echo $i; done zhang wen long [root@c7-server ~]# for i in "${my_array[*]}"; do echo $i; done zhang wen long
引用數組個數。
[root@c7-server ~]# echo ${#my_array[@]} 3 [root@c7-server ~]# echo ${#my_array[*]} 3
引用數組中元素的個數。
[root@c7-server ~]# echo ${my_array[0]} zhang [root@c7-server ~]# echo ${#my_array[0]} 5
接下來演示其他幾種不同的賦值方式,操作前可先刪除數組。
[root@c7-server ~]# unset my_array [root@c7-server ~]# my_array=([0]=zhang [1]=wen [2]=long) [root@c7-server ~]# echo ${my_array[@]} zhang wen long [root@c7-server ~]# unset my_array [root@c7-server ~]# read -a my_array Mon Tue Wed Thu Fri Sat Sun [root@c7-server ~]# echo ${my_array[@]} Mon Tue Wed Thu Fri Sat Sun
數組元素去子串(substring),即切片。
[root@c7-server ~]# echo ${my_array[@]} Mon Tue Wed Thu Fri Sat Sun [root@c7-server ~]# echo ${my_array[@]:3:2} Thu Fri [root@c7-server ~]# echo ${my_array[@]:2:3} Wed Thu Fri [root@c7-server ~]# echo ${my_array[@]: -3} Fri Sat Sun
數組元素追加。
[root@c7-server ~]# echo ${my_array[@]} Mon Tue Wed Thu Fri Sat Sun [root@c7-server ~]# my_array+=(ddd) [root@c7-server ~]# my_array[${#my_array[@]}]=eee [root@c7-server ~]# echo ${my_array[@]} Mon Tue Wed Thu Fri Sat Sun ddd eee
引用數組的下標(subscript)。個人感覺引用數組下標在關聯數組中比較有用,在索引數組中用處不大。
[root@c7-server ~]# echo ${!my_array[@]} 0 1 2 3 4 5 6 7 8 [root@c7-server ~]# unset my_array [root@c7-server ~]# declare -A my_array [root@c7-server ~]# my_array=([name]=zwl [age]=28 [sex]=male) [root@c7-server ~]# echo ${my_array[@]} zwl 28 male [root@c7-server ~]# echo ${!my_array[@]} name age sex
練習題
題一:生成10個隨機數並輸出,然後輸出其中的最大值和最小值。
題二:生成10個隨機數並輸出,然後將其由小到大進行排序。