Bash陣列


在小節中,我們將學習bash陣列的基礎知識以及如何在bash shell指令碼中使用。

陣列可以定義為相似型別元素的集合。與大多數程式設計語言不同,bash指令碼中的陣列不必是相似型別元素的集合。由於Bash不能將字串與數位區分開,因此陣列可以同時包含字串和數位。

Bash不支援多維陣列,Bash支援一維數位索引陣列以及關聯陣列。要從最後一個存取數位索引陣列,可以使用負索引。索引-1是最後一個元素的參考。可以在陣列中使用幾個元素。

1. Bash陣列宣告

Bash中的陣列可以通過以下方式宣告:

1.1. 建立數位索引陣列

可以使用任何變數作為已經索引的陣列,而無需宣告它。

使用關鍵字declare將變數顯式宣告為Bash陣列,並且語法可以定義為:

declare -a ARRAY_NAME

其中,
ARRAY_NAME表示分配給陣列的名稱。

注意:在Bash中命名變數的規則與命名陣列相同。

建立索引陣列的一般方法可以按以下形式定義:

ARRAY_NAME[index_1]=value_1  
ARRAY_NAME[index_2]=value_2  
ARRAY_NAME[index_n]=value_n

其中關鍵字index用於定義正整數。

1.2. 建立關聯陣列

與數位索引陣列不同,關聯陣列需要首先宣告。可以使用關鍵字declare-A(大寫)選項來宣告關聯陣列。語法定義為:

declare -A ARRAY_NAME

建立關聯陣列的通用方法可以按以下形式定義:

declare -A ARRAY_NAME  
ARRAY_NAME[index_foo]=value_foo  
ARRAY_NAME[index_bar]=value_bar  
ARRAY_NAME[index_xyz]=value_xyz

其中index_用於定義任何字串。

還可以通過以下方式編寫以上形式:

declare -A ARRAY_NAME  

ARRAY_NAME=(  
    [index_foo]=value_foo  
    [index_bar]=value_bar  
    [index_xyz]=value_xyz  
)

1.3. Bash陣列初始化

要初始化Bash陣列,可以使用賦值運算子(=),方法是指定括號內的元素列表,並用空格分隔,如下所示:

ARRAY_NAME=(element_1st element_2nd element_Nth)

注意:此處,第一個元素的索引為0。此外,賦值運算子(=)周圍不應有空格。

1.4. Bash陣列的存取元素

要存取Bash陣列的元素,可以使用以下語法:

echo ${ARRAY_NAME[2]}

Bash列印陣列

可以使用-p選項的關鍵字declare來列印帶有所有索引和詳細資訊的Bash陣列的所有元素。列印Bash陣列的語法為:

declare -p ARRAY_NAME

2. 陣列運算

分配陣列後,可以對其執行一些有用的操作。可以顯示鍵和值,也可以通過新增或刪除元素來對陣列進行修改:

2.1. 參照元素

要參照單個元素,首先需要知道元素的索引號。可以使用以下語法參照或列印任何元素:

${ARRAY_NAME[index]}

注意:需要使用花括號${}來避免shell的檔案名擴充套件運算子。

例如,列印一個索引為2的陣列元素,參考Bash指令碼:

#!/bin/bash  
#Script to print an element of an array with an index of 2  

#declaring the array  
declare -a example_array=( "Welcome" "To" "Yiibai" )  

#printing the element with index of 2  
echo ${example_array[2]}

執行上面範例程式碼,得到以下結果:

如果在指定的索引位置使用@*,它將擴充套件到陣列的所有成員。要列印所有元素,可以使用以下形式:

#!/bin/bash  
#Script to print all the elements of the array  

#declaring the array  
declare -a example_array=( "Welcome" "To" "Yiibai" )  

#Printing all the elements  
echo "${example_array[@]}"

執行上面範例程式碼,得到以下結果:

Welcome To Yiibai

使用@*之間的唯一區別是,使用@時,需要使用雙引號引起來。在第一種情況下(使用@時),擴充套件為陣列的每個元素提供了一個單詞的結果。可以使用for迴圈更好地描述它。假設有一個包含三個元素的陣列:」Welcome」 「To」 和 「Yiibai」,如下所示:

$example_array= (Welcome to Yiibai)

那麼使用@迴圈為:

for i in "${example_array[@]}"; do echo "$i"; done

執行上面範例程式碼,得到以下結果:

Welcome
To
Yiibai

應用帶有*的迴圈將產生單個結果,將陣列的所有元素都儲存為一個單詞:

Welcome To Yiibai

了解@*的用法很重要,因為在使用表單迭代陣列元素時,它很有用。

2.2. 列印陣列的鍵

還可以檢索和列印在索引或關聯陣列中使用的鍵(而不是它們各自的值)。可以通過新增!來執行。陣列名稱前的運算子如下:

${!ARRAY_NAME[index]}

範例:

#!/bin/bash  
#Script to print the keys of the array  

#Declaring the Array  
declare -a example_array=( "Welcome" "To" "Yiibai" )  

#Printing the Keys  
echo "${!example_array[@]}"

執行上面範例程式碼,得到以下結果:

0  1  2

2.3. 查詢陣列長度

可以使用以下形式來計算陣列中包含的元素數:

${#ARRAY_NAME[@]}

範例

#!/bin/bash  

#Declaring the Array  
declare -a example_array=( "Welcome" "To" "Yiibai" )  

#Printing Array Length  
echo "The array contains ${#example_array[@]} elements"

執行上面範例程式碼,得到以下結果:

The array contains 3 elements

2.4. 遍歷陣列

遍歷陣列中每個專案(元素)的通用方法是使用for迴圈。

範例

#!/bin/bash  
#Script to print all keys and values using loop through the array  

declare -a example_array=( "Welcome" "To" "Yiibai" )  

#Array Loop  
for i in "${!example_array[@]}"  
do  
echo The key value of element "${example_array[$i]}" is "$i"  
done

執行上面範例程式碼,得到以下結果:
遍歷數組

迴圈遍歷陣列的另一種常見方法是根據陣列的長度並使用C語言樣式的迴圈,如下範例程式碼:

#!/bin/bash  
#Script to loop through an array in C-style  

declare -a example_array=( "Welcome" "To" "Yiibai" )  

#Length of the Array  
length=${#example_array[@]}  

#Array Loop  
for (( i=0; i < ${length}; i++ ))  
do   
echo $i ${example_array[$i]}  
done

2.5. 將元素新增到陣列

可以選擇通過分別指定元素的索引或關聯鍵將元素新增到索引或關聯陣列。要將新元素新增到bash中的陣列中,可以使用以下形式:

ARRAY_NAME[index_n]="New Element"

範例

#!/bin/bash  

#Declaring an array  
declare -a example_array=( "Java" "Python" "PHP" "HTML" )  

#Adding new element  
example_array[4]="JavaScript"  

#Printing all the elements  
echo "${example_array[@]}"

執行上面範例程式碼,得到以下結果:

Java Python PHP HTML JavaScript

向陣列新增新元素的另一種方法是使用+=運算子。無需在此方法中指定索引。使用以下方式在陣列中新增一個或多個元素:

範例程式碼:

#!/bin/bash  

#Declaring the Array  
declare -a example_array=( "Java""Python""PHP" )  

#Adding new elements  
example_array+=( JavaScript CSS SQL )  

#Printing all the elements  
echo "${example_array[@]}"

執行上面範例程式碼,得到以下結果:

Java Python PHP JavaScript CSS SQL

2.6. 更新陣列元素

可以通過按索引值為現有陣列分配新值來更新陣列元素。下面將使用值Yiibai更改索引4處的陣列元素。

範例

#!/bin/bash  
#Script to update array element  

#Declaring the array  
declare -a example_array=( "We" "welcome" "you" "on" "nxtutor.com" )  

#Updating the Array Element  
example_array[4]=Yiibai  

#Printig all the elements of the Array  
echo ${example_array[@]}

執行上面範例程式碼,得到以下結果:

We welcome you on nxtutor.com

2.7. 從陣列中刪除元素

如果要從陣列中刪除元素,則在關聯陣列的情況下必須知道其索引或鍵。可以使用unset命令刪除元素:

unset ARRAY_NAME[index]

參考下面範例程式碼以更好地理解此概念:

#!/bin/bash  
#Script to delete the element from the array  

#Declaring the array  
declare -a example_array=( "Java" "Python" "HTML" "CSS" "JavaScript" )  

#Removing the element  
unset example_array[1]  

#Printing all the elements after deletion  
echo "${example_array[@]}"

執行上面範例程式碼,得到以下結果:

Java HTML CSS JavaScript

在上面範例中,建立了一個簡單的陣列,其中包含五個元素:"Java""Python""HTML""CSS""JavaScript"。然後,使用unset並參照其索引從陣列中刪除了Python元素。元素Python的索引為1,因為bash陣列從0開始。如果在刪除元素後檢視陣列的索引,應該會看到所刪除元素的索引丟失了。通過在指令碼中新增以下命令來檢查索引:

echo ${!example_array[@]}

執行上面範例程式碼,得到以下結果:

0 2 3 4

這個概念也適用於關聯陣列。

2.8. 刪除整個陣列

刪除整個陣列是一個非常簡單的任務。可以通過將陣列名稱作為引數傳遞給unset命令來執行,而無需指定索引或鍵。如下範例程式碼:

#!/bin/bash  
#Script to delete the entire Array  

#Declaring the Array  
declare -a example_array=( "Java" "Python" "HTML" "CSS" "JavaScript" )  

#Deleting Entire Array  
unset example_array  

#Printing the Array Elements  
echo ${!example_array[@]}  

#Printing the keys  
echo ${!example_array[@]}

執行上面範例程式碼,得到以下結果:

0 2 3 4

如果列印上述指令碼的內容將不會有輸出。返回空結果,因為陣列不再存在。

2.9. 切片陣列元素

Bash陣列也可以從給定的起始索引切到結束索引。要將陣列從起始索引m切到結束索引n,可以使用以下語法:

SLICED_ARRAY=(${ARRAY_NAME[@]:m:n}")

範例程式碼

#!/bin/bash  
#Script to slice Array Element from index 1 to index 3  

#Declaring the Array  
example_array=( "Java" "Python" "HTML" "CSS" "JavaScript" )  

#Slicing the Array   
sliced_array=("${example_array[@]:1:3}")  

#Applying for loop to iterate over each element in Array  
for i in "${sliced_array[@]}"  
do  
echo $i  
done

執行上面範例程式碼,得到以下結果: