在小節中,我們將學習bash陣列的基礎知識以及如何在bash shell指令碼中使用。
陣列可以定義為相似型別元素的集合。與大多數程式設計語言不同,bash指令碼中的陣列不必是相似型別元素的集合。由於Bash不能將字串與數位區分開,因此陣列可以同時包含字串和數位。
Bash不支援多維陣列,Bash支援一維數位索引陣列以及關聯陣列。要從最後一個存取數位索引陣列,可以使用負索引。索引-1
是最後一個元素的參考。可以在陣列中使用幾個元素。
Bash中的陣列可以通過以下方式宣告:
可以使用任何變數作為已經索引的陣列,而無需宣告它。
使用關鍵字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
用於定義正整數。
與數位索引陣列不同,關聯陣列需要首先宣告。可以使用關鍵字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
)
要初始化Bash陣列,可以使用賦值運算子(=
),方法是指定括號內的元素列表,並用空格分隔,如下所示:
ARRAY_NAME=(element_1st element_2nd element_Nth)
注意:此處,第一個元素的索引為
0
。此外,賦值運算子(=
)周圍不應有空格。
要存取Bash陣列的元素,可以使用以下語法:
echo ${ARRAY_NAME[2]}
Bash列印陣列
可以使用-p
選項的關鍵字declare
來列印帶有所有索引和詳細資訊的Bash陣列的所有元素。列印Bash陣列的語法為:
declare -p ARRAY_NAME
分配陣列後,可以對其執行一些有用的操作。可以顯示鍵和值,也可以通過新增或刪除元素來對陣列進行修改:
要參照單個元素,首先需要知道元素的索引號。可以使用以下語法參照或列印任何元素:
${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
了解@
和*
的用法很重要,因為在使用表單迭代陣列元素時,它很有用。
還可以檢索和列印在索引或關聯陣列中使用的鍵(而不是它們各自的值)。可以通過新增!
來執行。陣列名稱前的運算子如下:
${!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
可以使用以下形式來計算陣列中包含的元素數:
${#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
遍歷陣列中每個專案(元素)的通用方法是使用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
可以選擇通過分別指定元素的索引或關聯鍵將元素新增到索引或關聯陣列。要將新元素新增到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
可以通過按索引值為現有陣列分配新值來更新陣列元素。下面將使用值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
如果要從陣列中刪除元素,則在關聯陣列的情況下必須知道其索引或鍵。可以使用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
這個概念也適用於關聯陣列。
刪除整個陣列是一個非常簡單的任務。可以通過將陣列名稱作為引數傳遞給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
如果列印上述指令碼的內容將不會有輸出。返回空結果,因為陣列不再存在。
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
執行上面範例程式碼,得到以下結果: