數組是一種數據結構,表示具有相同數據類型的對象集合。bash shell中支持兩種類型的數組:關聯數組或索引數組。在本文中,將演示如何在 bash 中使用索引數組。以下使用 shell 示例來說明索引數組的詳細用法。 |
可以使用declare -a
隱式聲明一個索引數組。請注意,declare -A
選項用於隱式聲明關聯數組。
$ declare -a
你可以通過多種方式初始化索引數組。由於 bash 數組可以存儲整數或字符串,因此可以使用整數數組或字符串數組初始化給定的數組變量。甚至可以混合存儲整數和字符串。但是不能創建嵌套數組,Bash 只支持一維數組。
# 初始化一個索引數組,同時顯式聲明它 # declare -a my_array=(2 4 6 8 10) # 初始化一個索引數組,同時隱式聲明它 # my_array2=(orange apple grape mango) # 存儲整數和字符串的混合鍵值數組 # my_array3=(100 200 "bob" 500 "dan")
如果要使用默認值0來初始化較大的數組中每個元素,可以使用for 循環。
# 初始化一個大小爲 500 的數組,默認值爲0 # declare -a my_big_array=($(for i in {1..500}; do echo 0; done))
要在索引數組中的特定索引位置讀取或寫入值,使用中括號[]
指定索引。
# my_array2=(orange apple grape mango) # echo ${my_array2[2]} grape
如果不初始化數組,默認情況下數組中的每個元素都初始化爲空值。例如:
[root@localhost ~]# vim my_array.sh #!/bin/bash declare -a my_array4 my_array[10]=apple if [ -z "${my_array[0]}" ]; then echo "The element at index 0 is empty" else echo "The element at index 0 is non-empty: ${my_array[0]}" fi
執行腳本後輸出的結果:
# sh my_array.sh The element at index 0 is empty
如果想知道索引數組的長度時,可以使用以下帶有 #
和 @
符號的表達式。
# fruit_array=(orange apple grape mango) # echo "Array size: ${#fruit_array[@]}" Array size: 4
可以動態地將一個或多個值添加到數組的末尾,而不是在數組的特定位置寫入值。使用 +=
運算符來做到這一點。
# declare -a color_array=(red yellow) # color_array+=(blue) # color_array+=(black white)
另一種遞增索引數組的方法如下。
# fruit_array=(orange apple grape mango) # fruit_array=(${fruit_array[@]} pineappe watermelon)
還可以利用數組長度信息將值附加到數組的末尾。基本上你在數組的最後一個索引處插入一個值。
如果要遍歷索引數組,可以使用以下 for 循環。
[root@localhost ~]# vim array_for1.sh [root@localhost ~]# cat array_for1.sh #!/bin/bash declare -a color_array=(red yellow skyblue gray black white) for color in ${color_array[@]}; do echo $color done
以下是執行腳本後的輸出信息:
[root@localhost ~]# sh array_for1.sh red yellow skyblue gray black white
或者,可以使用數組索引遍歷數組,如下所示:
[root@localhost ~]# vim array_for2.sh [root@localhost ~]# cat array_for2.sh #!/bin/bash declare -a color_array=(red yellow skyblue gray black white) for i in ${!color_array[@]}; do echo $i - ${color_array[$i]} done
以下是輸出信息:
[root@localhost ~]# sh array_for2.sh 0 - red 1 - yellow 2 - skyblue 3 - gray 4 - black 5 - white
如果要打印數組的內容,當然可以遍歷數組,然後單獨打印每個值。另一種更方便的方法是使用[@]
,返回數組的內容。
# color_array=(red yellow skyblue gray black white) # echo ${color_array[@]} red yellow skyblue gray black white
bash 中的索引數組支持不同類型的數組切片,如下所示。
打印整個數組:
${my_array[@]}
數組切片的長度len
, 從index
開始:
${my_array[@]:index:len}
數組切片的長度len
, 從索引0開始:
${my_array[@]::len}
數組切片從輸入的索引值開始,到數組的結尾:
${my_array[@]:index}
查看以下 bash 數組切片示例以更好地瞭解其用法:
[root@localhost ~]# vim array_slice.sh [root@localhost ~]# cat array_slice.sh #!/bin/bash declare -a color_array=(red yellow skyblue gray black white pink purple) # 獲取整個數組 echo "Slice #1: ${color_array[@]}" # 從索引3開始獲取2個值 echo "Slice #2: ${color_array[@]:3:2}" # 獲取數組的前5個值 echo "Slice #3: ${color_array[@]::5}" # 獲取從索引4開始到結束的值 echo "Slice #4: ${color_array[@]:4}"
下面是運行腳本額之後獲取的數據值:
[root@localhost ~]# sh array_slice.sh Slice #1: red yellow skyblue gray black white pink purple Slice #2: gray black Slice #3: red yellow skyblue gray black Slice #4: black white pink purple