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" "zaixian" )

#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" "zaixian" )

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

執行上面示例代碼,得到以下結果:

Welcome To zaixian

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

$example_array= (Welcome to zaixian)

那麼使用@迴圈為:

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

執行上面示例代碼,得到以下結果:

Welcome
To
zaixian

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

Welcome To zaixian

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

2.2. 列印數組的鍵

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

${!ARRAY_NAME[index]}

示例:

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

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

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

執行上面示例代碼,得到以下結果:

0  1  2

2.3. 查找數組長度

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

${#ARRAY_NAME[@]}

示例

#!/bin/bash

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

#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" "zaixian" )

#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" "zaixian" )

#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. 更新數組元素

可以通過按索引值為現有數組分配新值來更新數組元素。下麵將使用值zaixian更改索引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]=zaixian

#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

執行上面示例代碼,得到以下結果:


上一篇: Bash函數 下一篇: Bash讀取檔