網站搜尋

Bash 索引陣列示例說明


陣列 是一種用來儲存特定類型值的資料結構。你也可以把陣列當作一個變數,但變數只能儲存一個值,而陣列可以在其中儲存多個值。陣列的概念並不僅限於 Bash。任何你使用的程式語言都會有陣列,只是實作方式有所不同。

Bash 支援兩種類型的陣列:

  • 索引陣列
  • 關聯陣列

索引陣列 是一種陣列,元素(數值)被存儲並分配一個從 0 到 N 的整數編號。陣列中的元素是通過索引號來參考的。您將在即將到來的文章中了解更多關於這個的內容。本文的主要重點僅限於索引陣列。

如何在 Bash 中初始化索引陣列

操作陣列的第一步是創建它。術語 創建、定義、初始化陣列 可以互換使用,但指的是相同的意思——創建陣列。

要建立一個陣列,你應該使用方括號,並將陣列元素(值)放在方括號內。

$ arr1=( one 2 three 4 )

重要注意事項:

  • Bash 陣列可以儲存不同資料類型的元素。在某些程式語言中,你只能在同類型的陣列中儲存值。
  • 陣列中可以儲存的元素數量沒有任何限制。這取決於您系統記憶體的可用性。

你也可以使用 declare 命令 並搭配 -a 參數來建立索引陣列。

$ declare -a arr1
$ arr1=( one 2 three 4 )

或者,

$ declare -a arr1=( one 2 three 4 )

如何新增或查看陣列的元素

你可以像前一節所示那樣創建一個有值的陣列,或者僅創建一個空陣列,稍後再添加值。以下是如何創建一個空陣列。

$ locations=()

陣列中的每個元素都有一個相關的索引值,從 0 到 N。你必須使用索引位置向陣列中添加新元素。

$ locations[0]="Chennai"
$ locations[1]="Mumbai"

這裡是將元素添加到陣列的圖示說明。

圖像表示 - 向陣列添加元素

要查看陣列中的元素,您可以使用以下任一語法。

$ echo ${locations[@]}
$ echo ${locations[*]}

初始化並列印陣列

要了解 @ 和 * 之間的差異以及它們如何與陣列一起使用,請參考我們 Bash For Loop 指南中「迴圈遍歷陣列元素」部分。

如果你嘗試列出陣列元素而不使用 @ 或 *,陣列中只有第一個元素會被列印出來。

$ echo ${locations}

不使用 * 或 @ 運算子的陣列

你可以使用索引位置直接訪問特定元素。

$ echo ${locations[1]}

在特定索引位置打印陣列

陣列的索引值

在前一節中,我已經展示了如何使用索引位置在陣列中添加元素。當你使用索引位置添加陣列時,你可以跳過並將元素添加到不同的索引位置。

陣列位置在 0 和 1 有兩個元素。現在我可以跳過索引 2,並添加到不同的索引位置。

$ locations[5]="Delhi"

新增元素

從上面的圖片中,你可以看到我已經在陣列的索引位置 5 添加了一個新元素。

圖形表示 - 向陣列添加新元素

如果您想要列印元素的索引值,請在陣列前加上 "!" 符號,如下所示:

$ echo ${!locations[@]}

這將只會列印索引值,而不是列印元素。

列印索引位置

要列印索引和元素,請使用以下程式片段。

for val in ${!locations[@]}
do
   echo "index = ${val} , value = ${locations[$val]}"
done

打印索引和元素

將值附加到陣列

你可以在不使用索引值的情況下向陣列添加新元素,這將把元素附加到陣列中。

locations=( Chennai Mumbai Delhi )
locations+=( Bangalore )
locations+=( Hyderabad )
$ echo ${locations[@]}
$ echo ${!locations[@]}

將元素附加到陣列

找到陣列的長度

你可以透過在陣列前加上 # 符號來取得陣列中有多少個元素。

$ echo ${#locations[@]}

陣列的長度

使用相同的 # 符號,你也可以檢查陣列是否為空。

if [[ ${#locations[@]} -ne 0 ]]; then
    echo "Array is Not empty"
else
    echo "Array is Empty"
fi

檢查陣列是否為空

從陣列中移除元素

要從陣列中移除一個元素,你可以使用 unset 命令。看看以下範例,使用 unset 命令從 index(2) 移除了元素。

$ echo ${locations[@]}
$ unset locations[2]
$ echo ${locations[@]}

從陣列中移除元素

移除陣列

要刪除陣列,您可以使用相同的 unset 指令。

$ unset locations
$ echo ${locations[@]}

移除陣列

清空陣列

有時你可能希望移除陣列中的所有元素並保持陣列為空。在這種情況下,你可以簡單地重新建立陣列。

$ echo ${locations[@]}
Chennai Mumbai Delhi Hyderabad Bangalore
$ locations=()
$ echo ${locations[@]}

將陣列清空

將命令輸出存儲為陣列

你可以執行任何命令並嘗試將輸出儲存在陣列中。命令應該用括號括起來,以便將輸出儲存為陣列。

$ path_list=( $(echo $PATH | tr ":" "\n") )
$ echo ${path_list[@]}

將命令輸出存儲為陣列

陣列切片

切片讓你可以根據元素的索引位置提取陣列中的特定元素。

以下是切片的語法:

${locations[@]:index:length}

如果你希望抓取所有元素,但從特定的起始索引位置開始,你可以僅使用索引以以下方式進行。

$ echo ${locations[@]:index} # syntax
$ echo ${locations[@]:2}

切片 - 索引位置

在上面的例子中,陣列將從索引位置 2 開始列印,直到最後一個元素。如果你在指定索引的同時指定了長度,那麼它將使用以下公式來切割陣列。

From index to index+length-1 (inclusive) # Formula
$ echo ${locations[@]:1:3}

切片 - 索引與長度

如果你跳過索引而只給出長度,那麼它將使用以下公式進行切割。

From Index 0 to length-1 (inclusive)
$ echo ${locations[@]::4}

切片 - 僅長度

結論

在本文中,我已經帶你了解了 bash 索引陣列。當你開始撰寫複雜的 bash 腳本時,陣列非常重要。它們讓你能夠輕鬆地存儲、檢索和操作不同類型的資料。與 Python 等程式語言不同,bash 沒有內建的方法可以輕鬆使用陣列來執行一些複雜的任務,但仍然是可以實現的。

在我們的下一篇指南中,我們將詳細討論關聯陣列。

  • Bash 腳本 - 關聯陣列解析與範例

相關閱讀:

  • Bash 腳本 - 使用範例解釋 While 與 Until 迴圈
  • Bash 腳本 - 函數解析與範例
  • Bash 腳本 - 變數說明與範例
  • Bash 重新導向說明與範例
  • Linux 中 Bash Echo 指令及範例說明
  • Bash Heredoc 初學者教程