Bash 數組指南
已發表: 2022-12-30在本 Bash 數組指南中,您將學習如何在 Bash 中聲明和使用索引數組和關聯數組。
在 Bash 中,您可以創建數組來存儲元素集合。 Bash 數組是一維集合。 在 C 和 C++ 等編程語言中,數組是相同數據類型的元素的集合。 但是,在 Bash 中,根據用例,您可以將整數和字符串存儲在同一個數組中。
在本教程中,您將學習如何聲明 Bash 數組並訪問其元素。 然後,您將學習如何遍歷數組的元素並將元素附加到數組。 最後,您將了解 Bash 中的關聯數組。
讓我們開始!
有興趣一起編碼嗎? 先決條件如下:
- 如果您使用的是 Mac 或 Linux 計算機,則可以打開終端並進行編碼。
- 如果您使用的是 Windows 機器,請安裝 Git Bash 或適用於 Linux 的 Windows 子系統 (WSL2)。
如何聲明 Bash 數組
在本節中,您將學習聲明 Bash 數組的語法和代碼示例。
Bash 數組聲明的語法
您可以使用以下語法在 Bash 中聲明一個數組:
$ arrayName=(elt1 elt2 ... eltN) # arrayName is the name of the array # elt1 through eltN are the N elements in the array
在上面的語法中, arrayName
表示包含N
個元素的數組的名稱elt1...eltN
。
數組的元素包含在左括號和右括號()
之間。 另外,請注意數組的元素由空格分隔。 與任何 Bash 變量一樣,賦值運算符=
前後不應有空格。
在大多數其他編程語言中,您將用逗號分隔數組或類似集合的元素。 但在 Bash 中,空格是分隔符。
在 Bash 中,元素由其索引標識的此類數組稱為索引數組。
在 Bash 中聲明索引數組
讓我們創建prices
,一個數字數組。
$ prices=(24 27 18 30 15)
如語法中所述,
prices
數組中的數字由空格分隔,括在括號中,= 賦值運算符前後沒有空格。
在 Bash 中,您可以使用echo
命令打印出變量的值。 使用$variableName
打印出variableName
的值。 但是,您可以看到使用數組名稱僅打印出第一個元素。
$ echo $prices 24
Bash 數組遵循零索引。 所以第一個元素在索引 0 處,第二個元素在索引 1 處,依此類推。 您也可以使用負索引; 最後一個數組元素的索引是 -1。
如果您嘗試訪問特定索引處的元素並將其打印出來,會發生什麼情況? 讓我們嘗試打印出索引 1 處的元素。
$ echo $prices[1] 24[1]
為什麼輸出是 24[1]? 這是因為 Bash 將$prices
替換為數組中的第一個元素 24,並且 [1] 是這樣打印出來的。
要打印出特定索引處的元素,您可以使用${prices[index]}
形式的參數擴展。
$ echo ${prices[1]} # 27 $ echo ${prices[2]} # 18
要打印出數組中的所有元素,您可以指定@
而不是特定索引。
$ echo ${prices[@]} 24 27 18 30 15
接下來,讓我們創建一個字符串數組。 運行以下命令創建一個索引數組:
$ declare -a fruits
選項-a
創建一個索引數組。 您現在可以通過在特定索引處聲明元素來填充數組,一次一個元素,如下所示:
$ fruits[0]="cherry" $ fruits[1]="berry" $ fruits[2]="apple" $ fruits[3]="pear" $ fruits[4]="melon" $ fruits[5]="orange"
現在,要打印出數組的所有元素,您可以使用${fruits[@]}
。
$ echo ${fruits[@]} cherry berry apple pear melon orange
訪問 Bash 數組的元素
您可以通過以下方式訪問數組的元素:
- 遍歷數組並直接訪問元素
- 遍歷索引集並訪問特定索引處的元素
遍歷數組並訪問元素
如果您使用 Python 編寫代碼,您將使用以下語法使用 for 循環:
for elt in some_list: print(elt)
現在讓我們編寫與上述 for 循環等效的 Bash。
我們知道{prices[@]}
擴展到prices
數組中的所有元素。 ${prices[@]}
為我們提供了所有元素的值。
Bash for 循環類似於 Python 的 for 循環語法,但循環體中的語句應包含在do
和done
中,如下所示:
$ for price in ${prices[@]} > do > echo $price > done
因為我們使用 echo 命令並打印出變量price
的值,所以我們得到以下輸出:
# output 24 27 18 30 15
使用數組索引訪問元素
遍歷數組的另一種方法是使用元素的索引。 這類似於 Python 中的 for 循環構造使用range()
函數:
for i in range(len(some_list)): print(i)
要獲取要循環的索引列表,您可以在參數擴展中的數組名稱前放置一個感嘆號 ( !
)。 這將為您提供數組的所有有效索引的列表,如下所示:
$ echo ${!prices[@]} 0 1 2 3 4
prices
數組包含 5 個元素,因此索引從 0 開始到 4。
接下來,我們可以遍歷索引列表並訪問每個索引處的元素。 對於索引i
, ${prices[i]}
是索引i
處的元素。
$ for i in ${!prices[@]} > do > echo ${prices[i]} > done
上面的循環打印出數組中的所有元素。
# output 24 27 18 30 15
在這裡,在訪問每個元素之後,我們執行一個簡單的操作來打印出它的值。 一般來說,我們可以對元素進行任何有效的處理。
將元素附加到 Bash 數組
在prices
數組中,我們有五個元素(索引為 0、1、2、3 和 4)。 如果要在索引 5 處的數組末尾添加一個元素,可以按如下方式進行:
$ prices[5]=21
我們看到 21 已附加到價格數組的末尾。
$ echo ${prices[@]} 24 27 18 30 15 21
但是,將最後添加的元素的索引或當前在數組中的元素數追加到數組的末尾更方便——無需記住。
您可以使用arrayName+=(elements(s))
將一個或多個元素附加到數組,如下所示:
$ prices+=(10)
現在,如果我們打印prices
數組,我們會看到 10 已附加到數組的末尾。
$ echo ${prices[@]} 24 27 18 30 15 21 10
接下來,讓我們學習如何在 Bash 中聲明關聯數組。
Bash 中的關聯數組
如果要根據鍵值對定義關係,可以使用關聯數組。 您可以使用以下通用語法聲明關聯數組。 請注意,我們使用-A
選項而不是-a
。
$ declare -A fruits_prices
您可以通過指定鍵和相應的值將元素添加到關聯數組。 在這裡,我們將水果的名稱添加為鍵,將價格數組中的數字添加為值。
$ fruits_prices[cherry]=24 $ fruits_prices[berry]=27 $ fruits_prices[apple]=18 $ fruits_prices[pear]=30 $ fruits_prices[melon]=15 $ fruits_prices[orange]=21
那麼我們如何訪問關聯數組中的元素呢?
就像您使用 Python 字典中的相應鍵查找值一樣,您可以使用鍵訪問關聯數組中的值。
$ echo ${fruits_prices[berry]} # 27
我們看到${fruits_prices[@]}
擴展為值, ${!fruits_prices[@]}
擴展為鍵。
$ echo ${fruits_prices[@]} # Output: 18 27 21 24 30 15 $ echo ${!fruits_prices[@]} # Output: apple berry orange cherry pear melon
注意:元素的順序與我們添加它們的順序不同。 這是因為,與索引數組不同,關聯數組不是有序集合。 相反,它們處理鍵和值之間的關聯。 因此,鍵對於關聯數組就像索引對於索引數組一樣。
您還可以遍歷關聯數組並訪問鍵,如下所示:
$ for key in ${!fruits_prices[@]} > do > echo $key > done
# Output apple berry orange cherry pear melon
以下循環顯示瞭如何訪問這些值。
$ for value in ${fruits_prices[@]} > do > echo $value > done
# Output 18 27 21 24 30 15
雖然建議使用arrayName[key]=value
,但您也可以將其聲明為這樣的序列:
declare -A arrayName arrayName=(key1 value1 key2 value2 ... keyN valueN)
這樣,Bash 將第一個元素推斷為第一個鍵,將第二個元素推斷為第一個值,依此類推。
加起來
我希望您現在了解如何創建和使用 Bash 數組。 下面是對所學內容的快速回顧。
- 您可以使用語法
arrayName=(elt1 elt2 elt3 ... eltN)
在 Bash 中聲明索引數組,或運行declare -a arrayName
並將元素添加到數組。 - 要訪問元素,您可以使用
${arrayName[@]}
循環。 或者,您可以使用參數擴展${!arrayName[@]}
獲取所有有效索引的列表。 - 最後,您還學習瞭如何在 Bash 中聲明關聯數組來存儲鍵值對。
接下來,查看 Bash 中的循環教程。