Bash 中的陣列

Bash 指令稿入門

Alex Scriven

Data Scientist

什麼是陣列?

Bash 中有兩種陣列:

  • 一般陣列
    • 以數值為索引的「普通」結構。
    • 在 Python 稱為「list」,在 R 稱為「vector」。

In Python: my_list = [1,3,2,4]

In R: my_vector <- c(1,3,2,4)

Bash 指令稿入門

在 Bash 建立陣列

在 Bash 中,建立數值索引陣列有兩種方式。

1. 先宣告,不加入元素

declare -a my_first_array

2. 同時建立並加入元素

my_first_array=(1 2 3)

記住:等號兩側不要有空白!

Bash 指令稿入門

小心逗號!

在 Bash 中不使用逗號分隔陣列元素:

這樣是錯的:

my_first_array=(1, 2, 3)

這樣才正確:

my_first_array=(1 2 3)
Bash 指令稿入門

重要的陣列屬性

  • 使用 array[@] 可取回所有元素。請注意,存取這些屬性時,Bash 需要在陣列名稱外加上花括號。
my_array=(1 3 5 2)
echo ${my_array[@]}
1 3 5 2
  • 陣列長度用 #array[@] 取得。
echo ${#my_array[@]}
4
Bash 指令稿入門

操作陣列元素

用方括號存取陣列元素。

my_first_array=(15 20 300 42)
echo ${my_first_array[2]}
300
  • 記住:Bash 的陣列採用從 0 開始的索引,和 Python 一樣(但 R 不一樣)
Bash 指令稿入門

操作陣列元素

用索引設定陣列元素。

my_first_array=(15 20 300 42 23 2 4 33 54 67 66)

my_first_array[0]=999
echo ${my_first_array[0]}
999
  • 注意:覆寫索引時不要加 $,像是 $my_first_array[0]=999 會失敗。
Bash 指令稿入門

操作陣列元素

使用 array[@]:N:M 表示法來「切片」取得子陣列。

  • 其中 N 為起始索引,M 為要回傳的元素數量。
my_first_array=(15 20 300 42 23 2 4 33 54 67 66)
echo ${my_first_array[@]:3:2}
42 23
Bash 指令稿入門

附加元素到陣列

array+=(elements) 來附加到陣列。

例如:

my_array=(300 42 23 2 4 33 54 67 66)

my_array+=(10) echo ${my_array[@]}
300 42 23 2 4 33 54 67 66 10
Bash 指令稿入門

(不)附加到陣列

若附加時沒有用括號會怎樣?來看看。

例如:

my_array=(300 42 23 2 4 33 54 67 66)
my_array+=10
echo ${my_array[@]}
30010 42 23 2 4 33 54 67 66

字串 10 會被接到第一個元素後面。不是我們想要的!

Bash 指令稿入門

關聯式陣列

  • 關聯式陣列
    • 類似一般陣列,但用鍵值配對,而非數值索引
    • 類似 Python 的 dictionary 或 R 的 list
    • 注意:僅 Bash 4 之後才支援。有些現代 Mac 仍是舊版 Bash!請在終端機用 bash --version 檢查

In Python:

my_dict = {'city_name': "New York", 'population': 14000000}

In R:

my_list = list(city_name = c('New York'), population = c(14000000))
Bash 指令稿入門

建立關聯式陣列

只能用 declare 語法(且使用大寫 -A)來建立關聯式陣列。

你可以先宣告再加入元素,或在同一行完成。

  • 把「鍵」放在方括號中,等號後面接對應的值。
    • 也可以一次加入多個元素。
Bash 指令稿入門

關聯式陣列範例

來做一個關聯式陣列:

declare -A city_details # 先宣告

city_details=([city_name]="New York" [population]=14000000) # 加入元素
echo ${city_details[city_name]} # 用鍵作索引取得值
New York
Bash 指令稿入門

建立關聯式陣列

或是,用一行同時建立並指派關聯式陣列

  • 其他用法都一樣
declare -A city_details=([city_name]="New York" [population]=14000000)

! 來取出關聯式陣列的「鍵」

echo ${!city_details[@]} # 回傳所有鍵
city_name population
Bash 指令稿入門

一起來練習吧!

Bash 指令稿入門

Preparing Video For Download...