Bash 提供了兩種類型的數組,分別是索引數組(indexed array)和關聯數組(associative array)。本文主要介紹索引數組的基本用法。
索引數組的基本特點
Bash 提供的數組都是一維數組。
任何變量都可以用作索引數組。
通過 declare 關鍵字可以顯式的聲明一個索引數組。
數組的大小是不受限制的。
索引數組的元素的索引不必是連續的。
通過從零開始的整數引用數組元素。
除非另外注明,索引數組必須使用非負的整數索引元素。
自動創建索引數組
通過賦值語句可以隱式的創建索引數組:
$ myArr[0]=apple
通過給索引為 0 的元素賦值,變量 myArr 會被初始化成一個索引數組。
當然也可以這樣:
$ myArr[3]=orange
不用必須從索引 0 開始賦值。
顯式聲明一個索引數組
通過 declare 關鍵字和 -a 選項可以顯式的聲明索引數組:
$ declare -a myArr
然后進行初始化:
$ myArr=(apple orange pear)
也可以在聲明的時候進行初始化:
$ declare -a myArr=(apple orange pear)
或者在聲明后只初始化某個元素:
$ myArr[0]=grape
引用數組元素
引用數組元素稍微麻煩些,不僅要指定元素的索引位置,還需要使用 ${} 符號。請注意,索引數組的下標從 0 開始,且不能為負數(真希望所有編程語言中的數組元素都從 0 開始索引!)。
$ myArr[0]=apple $ echo ${myArr[0]}
如果不小心引用了沒有賦值的元素呢?不用擔心,這里沒有程序崩潰的問題,只不過沒有輸出內容而已:
我們還可以輕松的輸出數組的全部元素:
$ declare -a myArr=(apple orange pear) $ myArr[10]=grape $ echo ${myArr[@]}
第四個元素的索引是不連續的。我們可以獲取到所有已經賦值元素的下標進行查看:
$ echo ${!myArr[@]}
變量也可以用來索引數組元素:
$ declare -a myArr=(apple orange pear) $ i=2 $ echo ${myArr[$i]}
對於索引數組,如果你不按規矩引用數組元素可能產生一些詭異的狀況。比如,用一個字符串代替非負的整數去索引元素會發生什么?
$ declare -a myArr=(apple orange pear) $ echo ${myArr[hello]}
這往往不是你想要的結果。實際上,無論你寫什么樣的字符串,都會被當做 0 來處理。
添加數組元素
比較常見的數組操作是在數組的尾部添加新的元素(嚴謹點說,這應該是隊列的一個特征!):
$ declare -a myArr=(apple orange pear) $ myArr=("${myArr[@]}" grape) $ echo ${myArr[@]}
請注意最后一行的輸出,這樣添加的元素的索引是連續的。
把兩個數組連接成一個也是比較常見的操作:
$ declare -a myAbc=(a b c) $ myArr=("${myArr[@]}" "${myAbc[@]}") $ echo ${myArr[@]}
提取子數組
提取部分數組元素:
$ declare -a myArr=(a b c d e f g) $ echo ${myArr[@]:2:3}
數組的長度
在 Bash 中,引用數組長度的語法多少有些奇特:
$ declare -a myArr=(apple orange pear) $ echo ${#myArr[@]}
數組長度是指被賦值了的元素個數:
$ myArr[10]=grape $ echo ${#myArr[@]}
我們還可以獲取到某個元素的長度:
哈哈,看起來有些像二維數組了!
遍歷數組元素
通過 for 語句可以像其它編程語言那樣遍歷數組中的元素:
$ declare -a myArr=(apple orange pear) $ myArr[10]=grape $ for element in "${myArr[@]}"; do echo $element done
刪除數組元素
$ declare -a myArr=(apple orange pear) $ unset myArr[1] $ echo ${myArr[1]}
索引為 1 的元素已經為空了,其實數組的長度也發生了變化:
$ echo ${#myArr[@]}
此時數組的長度已經變成了 2。
下面來個復雜點的:
$ declare -a myArr=(a b c d e f) $ myArr=("${myArr[@]:0:3}" "${myArr[@]:4}")
上面的代碼移除了元素 d:
清空數組
$ declare -a myArr=(apple orange pear) $ unset myArr $ echo ${myArr[@]}
OK,數組里已經沒有元素了!