Mảng (array) là một khái niệm cơ bản nhưng vô cùng quan trọng trong lập trình Bash. Việc nắm vững cách sử dụng mảng sẽ giúp bạn viết các script hiệu quả, linh hoạt và dễ bảo trì hơn. Trong bài viết này, Vietnix sẽ đồng hành cùng bạn khám phá thế giới mảng trong Bash, trang bị kiến thức từ A đến Z để bạn tự tin làm chủ Bash Array.
Mảng trong Bash là gì?
Mảng trong Bash là một danh sách các giá trị được lưu trữ dưới một biến duy nhất. Các giá trị trong mảng được gọi là phần tử, được quản lý và truy xuất thông qua chỉ mục.
Không giống như các ngôn ngữ lập trình như C hoặc C++, các mảng Bash hoạt động như một bộ nhớ một chiều cho các kiểu dữ liệu đa dạng. Ví dụ, một mảng trong Bash có thể sắp xếp dữ liệu số và chuỗi một cách đồng thời theo một cấu trúc có trật tự. Điểm mạnh của mảng trong Bash còn nằm ở khả năng tự động thay đổi kích thước và phân bổ bộ nhớ.
Không những là môi trường ứng dụng Array, Bash còn là môi trường hỗ trợ dòng lệnh (shell) trong việc thực hiện các tập lệnh (script) – chạy tập lệnh Bash. Ngoài ra, Bash còn đóng vai trò là một dòng lệnh hữu ích trên hệ điều hành Linux – lệnh Bash.
Bên cạnh đó, bạn có thể tìm hiểu thêm: Bash có phải là ngôn ngữ lập trình
5 ứng dụng của mảng trong Bash
Mảng trong Bash có thể được ứng dụng trong nhiều trường hợp, bao gồm:
- Lưu trữ dữ liệu: Mảng là công cụ hiệu quả để lưu trữ thông tin trong các script shell, cho phép thao tác dữ liệu một cách linh hoạt.
- Quản lý cấu hình: Mảng có thể được sử dụng để quản lý cấu hình hệ thống trong các script Bash.
- Xử lý file: Mảng cho phép truy cập và xử lý nội dung của các file một cách hiệu quả.
- Quản lý tiến trình và dịch vụ: Mảng có thể lưu trữ và quản lý thông tin về tên dịch vụ, ID tiến trình và các thông tin liên quan khác trong các script quản trị hệ thống.
- Kiểm tra và xác thực dữ liệu: Mảng Bash có thể được dùng để kiểm tra xem dữ liệu nhập vào có đúng hay không. Ví dụ, bạn có thể kiểm tra tính hợp lệ của giá trị do người dùng nhập vào bằng cách so sánh với các giá trị trong mảng.
Các loại mảng trong Bash
Có hai loại mảng chính trong Bash:
- Mảng được lập chỉ mục (Numerically Indexed Array): Dạng mảng tham chiếu đến các phần tử dữ liệu bằng cách sử dụng chỉ số bắt đầu từ ‘0’. Vì vậy, nếu một mảng chứa hai phần tử, giá trị đầu tiên được đặt ở chỉ số 0 trong khi phần tử thứ hai (phần tử cuối cùng) ở chỉ số 1.
- Mảng kết hợp (Associative Array): Mảng kết hợp sử dụng chuỗi làm chỉ mục để truy xuất các giá trị.
Dựa trên số chiều, mảng trong Bash có thể được phân loại thành:
- Mảng một chiều (1-D Array): Đây là loại mảng phổ biến nhất, là một danh sách các giá trị, còn được gọi là mảng được lập chỉ số theo số. Loại mảng này được lập chỉ số bắt đầu từ 0 và các phần tử được truy cập thông qua các chỉ số.
- Mảng đa chiều (Multidimensional Array): Bash không hỗ trợ trực tiếp mảng đa chiều như Python hay C++. Tuy nhiên, bạn có thể mô phỏng mảng đa chiều bằng cách tạo một mảng chứa các mảng con, trong đó các phần tử được sắp xếp theo dạng lưới hoặc ma trận.
2 cách sử dụng cơ bản mảng trong Bash
Cách 1: Khai báo mảng trong Bash
Mặc dù Bash là ngôn ngữ script linh hoạt nhưng việc khai báo mảng là bước đầu tiên và quan trọng khi bạn muốn làm việc với mảng. Bạn có thể khai báo mảng trong Bash bằng cách sử dụng cú pháp sau với lệnh declare
:
declare -a <array_name>
Ví dụ dưới đây ta sẽ tạo một mảng có tên tennis_kit bằng cách sử dụng Bash Scripting như sau:
Cách 2: In mảng trong Bash
In mảng là thao tác phổ biến trong lập trình Bash, giúp kiểm tra kết quả và hiển thị dữ liệu. Có nhiều cách để in toàn bộ nội dung của một mảng trong Bash. Dưới đây là hai cách phổ biến bằng lệnh echo:
echo ${array[@]}
Hoặc
echo ${array[*]}
Bạn có thể xem ví dụ chạy song song lệnh Bash bên dưới để hiểu rõ hơn:
5 ví dụ về cách thao tác cơ bản với mảng trong Shell Script
Ví dụ 1: Duyệt qua mảng trong Bash
Khi làm việc với mảng trong Bash
, việc truy cập vào các phần tử của mảng là rất quan trọng. Bạn có thể sử dụng các phần tử để in ra hoặc thực hiện các thao tác khác trên mảng. Trong phần này, Vietnix sẽ hướng dẫn bạn cách truy cập các phần tử mảng bằng cách sử dụng chỉ số của chúng.
Như đã trình bày ở phần trước, chỉ số của mảng bắt đầu từ 0 và tăng dần lên 1. Ví dụ, để lấy giá trị của phần tử thứ hai trong mảng, bạn sử dụng đoạn code sau:
echo ${array_name[index_num]}
Chẳng hạn:
Ví dụ 2: In các phần tử cụ thể của một mảng trong Bash
Ngoài việc in toàn bộ mảng, bạn cũng có thể in ra các phần tử cụ thể bằng cách sử dụng chỉ số. Bạn hãy xem ví dụ sau:
Trong hình trên, bạn có thể thấy kết quả đã in ra 3 phần tử cụ thể (phần tử thứ 2, thứ 5 và phần tử cuối cùng) từ mảng currency gồm 8 phần tử.
Ví dụ 3: Đo chiều dài của một mảng trong Bash
Mảng trong Bash khác với mảng trong Python ở chỗ mảng có thể thay đổi kích thước. Khi bạn thêm phần tử vào mảng, chiều dài sẽ tự động tăng lên. Để quản lý bộ nhớ hiệu quả, việc biết chiều dài hiện tại của mảng rất quan trọng.
Để tìm chiều dài của một mảng, bạn chỉ cần thêm dòng lệnh sau vào shell script của mình:
echo ${#arr_name[@]}
length= ${#arr_name[@]}
echo $length
Ví dụ:
Script Bash trên đã hiển thị thành công độ dài của mảng hosting ra màn hình.
Ví dụ 4: Lặp qua các phần tử mảng trong Bash
Để truy cập và in các phần tử của mảng Bash, cách thường dùng nhất là sử dụng chỉ số. Bạn cũng có thể sử dụng vòng lặp for để truy cập các phần tử mảng bằng cú pháp sau:
for items in ${arr_name[@]}
do
echo $items
done
Ví dụ:
Chương trình này sử dụng vòng lặp for để in ra các giá trị của mảng VPS một cách tuần tự.
Ví dụ 5: Xóa mảng trong Bash
Nếu bạn muốn xóa toàn bộ một mảng sau khi hoàn thành các tác vụ cần thiết, bạn sử dụng lệnh unset. Tuy nhiên, cú pháp sử dụng unset để xóa mảng khác (hủy cài đặt với một biến trong môi trường Linux) so với xóa từng phần tử.
Trong trường hợp này, bạn không chỉ định chỉ số phần tử như khi xóa từng phần tử.
Ví dụ:
Sau khi chạy đoạn script trên, máy tính sẽ không hiển thị gì trên màn hình cả. Điều này chứng tỏ mảng language
đã bị xóa thành công.
6 thao tác khác với mảng trong Bash
Thêm phần tử vào mảng trong Bash
Để thêm phần tử vào mảng trong Bash, bạn sử dụng toán tử += với cú pháp như sau:
array_name+=(element to be appended)
Ví dụ:
Chèn phần tử vào mảng trong Bash
Để chèn phần tử vào một vị trí cụ thể trong mảng, bạn sử dụng cú pháp sau:
array_name[position]= element to be inserted
Ví dụ:
Kết quả: Mảng bd_bands
sẽ có các phần tử được chèn vào vị trí mong muốn. Các chỉ số được in ra sẽ cho thấy vị trí của các phần tử trong mảng.
Cập nhật phần tử mảng trong Bash
Để cập nhật giá trị của một phần tử trong mảng, bạn sử dụng cú pháp sau:
example_array[index]=updated element
Ví dụ:
Kết quả: Mảng topGun
sẽ có phần tử thứ 3 được cập nhật thành giá trị mới.
Xóa phần tử khỏi mảng trong Bash
Để xóa một phần tử trong mảng, bạn sử dụng lệnh unset với cú pháp như sau:
unset example_array[index]
Ví dụ:
Kết quả: Mảng brands
sẽ không còn chứa phần tử nike.
Cắt mảng trong Bash
Khi bạn có một mảng dài trong Bash và muốn truy cập vào một số phần tử nhất định, bạn có thể sử dụng kỹ thuật Array Slicing (cắt mảng). Cú pháp thực hiện như sau:
${array_name[@]:X:Y}
Ví dụ:
Gộp 2 mảng trong Bash
Để gộp 2 mảng thành 1 mảng mới, bạn sử dụng toán tử mở rộng mảng ${array[@]}
với cú pháp như sau:
merged_array=(${array1[@]} ${array2[@]})
Ví dụ:
Kết quả: Mảng merged_array
sẽ chứa tất cả các phần tử của 2 mảng ban đầu.
Ví dụ:
Kết quả:
4 ví dụ thực tế về cách sử dụng mảng trong Bash Script
Ví dụ 1: Đọc nội dung file vào mảng trong Bash
Để đọc nội dung của 1 file vào mảng, bạn sử dụng script Bash sau:
Kết quả: Mảng array_of_file
sẽ chứa các dòng của file đã đọc.
Ví dụ 2: Sắp xếp mảng trong Bash với thuật toán Bubble Sort (sắp xếp nổi bọt)
Sắp xếp là một thao tác quan trọng trong lập trình, giúp cho việc truy xuất và phân tích dữ liệu trở nên hiệu quả hơn. Trong ví dụ này, Vietnix sẽ giới thiệu đến bạn cách triển khai thuật toán Bubble Sort (sắp xếp nổi bọt) trên mảng trong Bash.
Bubble Sort là thuật toán sắp xếp dễ hiểu nhất, hoạt động dựa trên việc so sánh các phần tử liền kề. Nếu hai phần tử liền kề không theo thứ tự mong muốn (tăng dần hoặc giảm dần), cả hai phần tử sẽ được hoán đổi vị trí. Quá trình này được lặp lại cho đến khi toàn bộ mảng được sắp xếp theo đúng thứ tự.
Để sắp xếp mảng Bash bằng Bubble Sort, bạn sử dụng script Bash sau:
Kết quả: Script trên đã sắp xếp mảng numbers theo thứ tự tăng dần.
Ví dụ 3: Tìm kiếm tuyến tính (Linear Search) trong mảng Bash
Tìm kiếm tuyến tính là một thuật toán tìm kiếm đơn giản trong mảng. Thuật toán này hoạt động bằng cách lặp qua từng phần tử của mảng và kiểm tra xem phần tử đó có khớp với giá trị cần tìm hay không.
Để tìm kiếm một phần tử cụ thể trong mảng Bash bằng tìm kiếm tuyến tính, sử dụng script Bash sau:
Kết quả: Script này sẽ tìm kiếm giá trị được nhập bởi người dùng trong mảng. Nếu tìm thấy sẽ in ra vị trí của giá trị đó. Nếu không tìm thấy sẽ thông báo rằng giá trị đó không có trong mảng.
Ví dụ 4: Mô phỏng mảng đa chiều trong Bash
Bash chủ yếu hỗ trợ mảng một chiều và không có kiểu dữ liệu mảng đa chiều. Tuy nhiên, bạn có thể mô phỏng mảng đa chiều bằng cách sử dụng vòng lặp for trong Bash.
Ví dụ:
Kết quả: Script sẽ in ra một mảng đa chiều với số hàng và số cột do người dùng nhập vào, mỗi phần tử của mảng sẽ chứa một số ngẫu nhiên. Đoạn script bash ở trên in ra một mảng đa chiều có 2 hàng và 3 cột .
Câu hỏi thường gặp
Mảng trong Bash có thể chứa các loại dữ liệu khác nhau không?
Hoàn toàn có thể. Mảng trong Bash có một đặc điểm rất linh hoạt, đó là không yêu cầu khai báo kiểu dữ liệu cho các phần tử.
Có thể thay đổi giá trị của các phần tử trong một mảng sau khi tạo không?
Có thể. Bạn có thể thay đổi bằng cách truy cập vào phần tử và gán giá trị mới.
Lời kết
Bài viết đã cung cấp cho bạn một cái nhìn tổng quan về mảng trong Bash, bao gồm cách tạo, truy cập, thao tác và ứng dụng của mảng trong các kịch bản Bash. Hy vọng những kiến thức này sẽ giúp bạn sử dụng mảng một cách hiệu quả trong công việc của mình.