Hướng dẫn về mảng Bash

Trong hướng dẫn về mảng Bash này, bạn sẽ học cách khai báo và làm việc với các mảng được lập chỉ mục và mảng kết hợp trong Bash.
Trong Bash, bạn có thể tạo các mảng để lưu trữ một tập hợp các phần tử. Mảng Bash là tập hợp một chiều. Trong các ngôn ngữ lập trình như C và C++, mảng là tập hợp các phần tử có cùng kiểu dữ liệu. Tuy nhiên, trong Bash, tùy thuộc vào trường hợp sử dụng, bạn có thể lưu trữ các số nguyên và chuỗi trong cùng một mảng.
Trong hướng dẫn này, bạn sẽ học cách khai báo một mảng Bash và truy cập các phần tử của nó. Sau đó, bạn sẽ học cách lặp qua các phần tử của một mảng và nối thêm các phần tử vào một mảng. Cuối cùng, bạn sẽ tìm hiểu về mảng kết hợp trong Bash.
Hãy bắt đầu nào!
⚙ Quan tâm đến việc viết mã cùng? Đây là những điều kiện tiên quyết:
Cách khai báo một mảng Bash
Trong phần này, bạn sẽ tìm hiểu cú pháp để khai báo một mảng Bash và các ví dụ về mã.
Cú pháp khai báo mảng Bash
Bạn có thể khai báo một mảng trong Bash bằng cú pháp sau:
$ arrayName=(elt1 elt2 ... eltN) # arrayName is the name of the array # elt1 through eltN are the N elements in the array
Trong cú pháp trên, ArrayName biểu thị tên của mảng chứa N phần tử elt1…eltN.
Các phần tử của một mảng được đặt giữa dấu ngoặc đơn mở và đóng (). Ngoài ra, lưu ý rằng các phần tử của mảng được phân tách bằng khoảng trắng. Như với bất kỳ biến Bash nào, không được có khoảng trắng trước hoặc sau toán tử gán =.
📑 Trong hầu hết các ngôn ngữ lập trình khác, bạn sẽ phân tách các phần tử của một mảng hoặc các tập hợp tương tự bằng dấu phẩy. Nhưng trong Bash, khoảng trắng là dấu phân cách.
Trong Bash, các mảng như vậy trong đó các phần tử được xác định bởi chỉ mục của chúng được gọi là mảng được lập chỉ mục.
Khai báo các mảng được lập chỉ mục trong Bash
Hãy tạo giá, một mảng số.
$ prices=(24 27 18 30 15)
Như đã đề cập trong cú pháp, các số trong mảng giá được phân tách bằng khoảng trắng, được đặt trong dấu ngoặc đơn, không có khoảng trắng trước và sau toán tử gán =.
Trong Bash, bạn có thể sử dụng lệnh echo để in ra giá trị của một biến. Sử dụng $variableName in ra giá trị của tên biến. Tuy nhiên, bạn có thể thấy rằng việc sử dụng tên của mảng sẽ chỉ in ra phần tử đầu tiên.
$ echo $prices 24
Mảng Bash tuân theo chỉ mục bằng không. Vì vậy, phần tử đầu tiên ở chỉ số 0, phần tử thứ hai ở chỉ số 1, v.v. Bạn cũng có thể sử dụng lập chỉ mục tiêu cực; chỉ số của phần tử mảng cuối cùng là -1.
Điều gì xảy ra nếu bạn cố gắng truy cập phần tử tại một chỉ mục cụ thể và in nó ra? Hãy thử in ra phần tử ở chỉ số 1.
$ echo $prices[1] 24[1]
Tại sao đầu ra là 24[1]? 🤔 Điều này là do Bash thay thế $prices bằng 24, phần tử đầu tiên trong mảng và [1] được in ra như vậy.
Để in phần tử tại một chỉ mục cụ thể, bạn có thể sử dụng phần mở rộng tham số có dạng ${prices[index]}.
$ echo ${prices[1]} # 27 $ echo ${prices[2]} # 18
Để in ra tất cả các phần tử trong mảng, bạn có thể chỉ định @ thay vì chỉ mục cụ thể.
$ echo ${prices[@]} 24 27 18 30 15
Tiếp theo, hãy tạo một mảng các chuỗi. Chạy lệnh sau sẽ tạo một mảng được lập chỉ mục:
$ declare -a fruits
Tùy chọn -a tạo một mảng được lập chỉ mục. Bây giờ, bạn có thể điền vào mảng, từng phần tử một, bằng cách khai báo phần tử tại một chỉ mục cụ thể, như minh họa bên dưới:
$ fruits[0]="cherry" $ fruits[1]="berry" $ fruits[2]="apple" $ fruits[3]="pear" $ fruits[4]="melon" $ fruits[5]="orange"
Bây giờ, để in ra tất cả các phần tử của mảng, bạn có thể sử dụng ${fruits[@]}.
$ echo ${fruits[@]} cherry berry apple pear melon orange
Truy cập các phần tử của một mảng Bash
Bạn có thể truy cập các phần tử của mảng theo các cách sau:
- Lặp qua mảng và truy cập phần tử trực tiếp
- Lặp qua tập hợp các chỉ mục và truy cập các phần tử tại một chỉ mục cụ thể
Lặp qua mảng và truy cập các phần tử
Nếu bạn đã viết mã bằng Python, bạn sẽ sử dụng vòng lặp for bằng cú pháp sau:
for elt in some_list: print(elt)
Bây giờ chúng ta hãy viết Bash tương đương với vòng lặp for ở trên.
Chúng tôi biết rằng {giá[@]} mở rộng đến tất cả các phần tử trong mảng giá. Và ${giá[@]} cung cấp cho chúng ta các giá trị của tất cả các phần tử.
Vòng lặp for của Bash tương tự như cú pháp vòng lặp for của Python, nhưng các câu lệnh trong thân vòng lặp phải được đặt trong do và done, như minh họa:
$ for price in ${prices[@]} > do > echo $price > done
Vì chúng ta sử dụng lệnh echo và in ra giá trị của biến price nên ta được kết quả như sau:
# output 24 27 18 30 15
Truy cập các phần tử bằng cách sử dụng chỉ mục mảng
Một cách khác để lặp qua các mảng là sử dụng chỉ mục của các phần tử. Điều này tương tự như cấu trúc vòng lặp for trong Python đang sử dụng hàm range():
for i in range(len(some_list)): print(i)
Để có danh sách các chỉ mục để lặp qua, bạn có thể đặt dấu chấm than (!) trước tên mảng trong phần mở rộng tham số. Điều này sẽ cung cấp cho bạn danh sách tất cả các chỉ mục hợp lệ cho mảng, như được hiển thị:
$ echo ${!prices[@]} 0 1 2 3 4
Mảng giá chứa 5 phần tử, vì vậy chỉ số bắt đầu từ 0 và tăng lên 4.
Tiếp theo, chúng ta có thể lặp qua danh sách các chỉ mục và truy cập phần tử tại mỗi chỉ mục. Đối với chỉ số i, ${prices[i]} là phần tử tại chỉ số i.
$ for i in ${!prices[@]} > do > echo ${prices[i]} > done
Vòng lặp trên in ra tất cả các phần tử trong mảng.
# output 24 27 18 30 15
💬 Tại đây, sau khi truy cập từng phần tử, chúng ta thực hiện một thao tác đơn giản là in ra giá trị của nó. Nói chung, chúng ta có thể có bất kỳ xử lý hợp lệ nào trên các phần tử.
Nối các phần tử vào một mảng Bash
Trong mảng giá, chúng ta có 5 phần tử (tại các chỉ số 0,1,2,3 và 4). Nếu bạn muốn thêm một phần tử vào cuối mảng ở chỉ số 5, bạn có thể làm như sau:
$ prices[5]=21
Chúng tôi thấy rằng 21 đã được thêm vào cuối mảng giá.
$ echo ${prices[@]} 24 27 18 30 15 21
Tuy nhiên, sẽ thuận tiện hơn nếu nối vào cuối mảng—mà không cần nhớ—chỉ số của phần tử được thêm vào cuối cùng hoặc số lượng phần tử hiện có trong mảng.
Bạn có thể sử dụng arrayName+=(elements(s)) để nối thêm một hoặc nhiều phần tử vào một mảng, như minh họa:
$ prices+=(10)
Bây giờ, nếu chúng ta in mảng giá ra, chúng ta sẽ thấy rằng 10 đã được thêm vào cuối mảng.
$ echo ${prices[@]} 24 27 18 30 15 21 10
Tiếp theo, hãy tìm hiểu cách khai báo mảng kết hợp trong Bash.
Mảng kết hợp trong Bash
Nếu bạn muốn xác định mối quan hệ theo các cặp khóa-giá trị, bạn có thể sử dụng một mảng kết hợp. Bạn có thể khai báo một mảng kết hợp bằng cú pháp chung sau. Lưu ý rằng chúng tôi sử dụng tùy chọn -A thay vì -a.
$ declare -A fruits_prices
Bạn có thể thêm các phần tử vào mảng kết hợp bằng cách chỉ định khóa và giá trị tương ứng. Ở đây, chúng tôi đã thêm tên của các loại trái cây làm khóa và các số từ mảng giá làm giá trị.
$ fruits_prices[cherry]=24 $ fruits_prices[berry]=27 $ fruits_prices[apple]=18 $ fruits_prices[pear]=30 $ fruits_prices[melon]=15 $ fruits_prices[orange]=21
Vậy làm thế nào để chúng ta truy cập các phần tử trong một mảng kết hợp?
Giống như cách bạn tra cứu giá trị bằng cách sử dụng khóa tương ứng trong từ điển Python, bạn có thể truy cập các giá trị trong một mảng kết hợp bằng cách sử dụng các khóa.
$ echo ${fruits_prices[berry]} # 27
Chúng tôi thấy rằng ${fruits_prices[@]} mở rộng thành các giá trị và ${!fruits_prices[@]} mở rộng đến các phím.
$ echo ${fruits_prices[@]} # Output: 18 27 21 24 30 15 $ echo ${!fruits_prices[@]} # Output: apple berry orange cherry pear melon
Lưu ý: Thứ tự của các phần tử không giống với thứ tự mà chúng tôi đã thêm chúng. Điều này là do, không giống như các mảng được lập chỉ mục, các mảng kết hợp không phải là các bộ sưu tập có thứ tự. Thay vào đó, chúng hoạt động dựa trên sự liên kết giữa khóa và giá trị. Do đó, các khóa dành cho các mảng kết hợp còn các chỉ mục dành cho các mảng chỉ mục.
Bạn cũng có thể lặp qua mảng kết hợp và truy cập các khóa, như được hiển thị:
$ for key in ${!fruits_prices[@]} > do > echo $key > done
# Output apple berry orange cherry pear melon
Vòng lặp sau đây cho thấy cách bạn có thể truy cập các giá trị.
$ for value in ${fruits_prices[@]} > do > echo $value > done
# Output 18 27 21 24 30 15
Mặc dù nên sử dụng ArrayName[key]=value, bạn cũng có thể khai báo nó như một dãy như sau:
declare -A arrayName arrayName=(key1 value1 key2 value2 ... keyN valueN)
Bằng cách này, Bash suy ra phần tử đầu tiên là khóa đầu tiên, phần tử thứ hai là giá trị đầu tiên, v.v.
Tổng hợp
Tôi hy vọng bây giờ bạn đã hiểu cách tạo và làm việc với mảng Bash. Đây là một đánh giá nhanh về những gì bạn đã học được.
- Bạn có thể khai báo một mảng được lập chỉ mục trong Bash bằng cách sử dụng cú pháp arrayName=(elt1 elt2 elt3 … eltN) hoặc chạy khai báo -a arrayName và thêm các phần tử vào mảng.
- Để truy cập các phần tử, bạn có thể lặp lại bằng cách sử dụng ${arrayName[@]}. Ngoài ra, bạn có thể lấy danh sách tất cả các chỉ mục hợp lệ bằng cách sử dụng phần mở rộng tham số ${!arrayName[@]}.
- Cuối cùng, bạn cũng đã học cách khai báo một mảng kết hợp để lưu trữ các cặp khóa-giá trị trong Bash.
Tiếp theo, hãy xem hướng dẫn về vòng lặp trong Bash.