Friday, October 25, 2024

[Bash] Lesson 26 – Bash Array

-

Bash Array
Trong chủ đề này, chúng ta sẽ giới thiệu về cơ bản của mảng trong bash và cách chúng được sử dụng trong lập trình shell bash.

Một mảng có thể được định nghĩa như là một bộ sưu tập các phần tử tương tự. Khác với hầu hết các ngôn ngữ lập trình, mảng trong shell bash không cần phải là một bộ sưu tập các phần tử tương tự. Vì Bash không phân biệt chuỗi từ một số, một mảng có thể chứa cả chuỗi và số.

Bash không hỗ trợ mảng đa chiều; chúng ta không thể có các phần tử là mảng trong mảng. Bash hỗ trợ mảng chỉ số theo số nguyên một chiều cũng như các mảng liên kết. Để truy cập vào mảng chỉ số theo số nguyên từ cuối, chúng ta có thể sử dụng các chỉ số âm. Chỉ số ‘-1’ sẽ được xem là tham chiếu đến phần tử cuối cùng. Chúng ta có thể sử dụng nhiều phần tử trong một mảng.

Khai báo Mảng trong Bash
Mảng trong Bash có thể được khai báo bằng các cách sau:

Tạo Mảng Chỉ Số Theo Số Nguyên

Chúng ta có thể sử dụng bất kỳ biến nào như một mảng chỉ số mà không cần khai báo.

Để rõ ràng khai báo một biến là Mảng Bash, sử dụng từ khóa ‘declare’ và cú pháp có thể được định nghĩa như sau:

declare -a ARRAY_NAME  

Trong đó ARRAY_NAME chỉ ra tên mà chúng ta sẽ gán cho mảng.

Chú ý: Các quy tắc đặt tên biến trong Bash giống như đặt tên một mảng.

Một cách thông thường để tạo một mảng được chỉ mục có thể được định nghĩa theo định dạng sau:

ARRAY_NAME[index_1]=value_1  
ARRAY_NAME[index_2]=value_2  
ARRAY_NAME[index_n]=value_n  

Khác với mảng được lập chỉ mục theo số, mảng kết hợp được khai báo trước. Chúng ta có thể sử dụng từ khóa ‘declare’ và tùy chọn -A (viết hoa) để khai báo mảng kết hợp. Cú pháp có thể được định nghĩa như sau:

declare -A ARRAY_NAME  

A general method to create an associative array can be defined in the following form:

declare -A ARRAY_NAME  
ARRAY_NAME[index_foo]=value_foo  
ARRAY_NAME[index_bar]=value_bar  
ARRAY_NAME[index_xyz]=value_xyz  

Ở đây chúng ta khai báo một mảng có tính chất liên kết (associative arrays). Chúng ta sử dụng từ khóa ‘declare’ và tùy chọn -A (in hoa) để khai báo mảng liên kết. Cú pháp được định nghĩa như sau:”

declare -A ARRAY_NAME  
  
ARRAY_NAME=(  
    [index_foo]=value_foo  
    [index_bar]=value_bar  
    [index_xyz]=value_xyz  
)  

Để khởi tạo một mảng trong Bash, chúng ta có thể sử dụng toán tử gán (=), bằng cách chỉ định danh sách các phần tử trong dấu ngoặc đơn, cách nhau bởi khoảng trắng như dưới đây:

ARRAY_NAME=(element_1st element_2nd element_Nth)  

Chú ý: Ở đây, phần tử đầu tiên sẽ có chỉ mục là 0. Ngoài ra, không nên có khoảng trắng xung quanh toán tử gán (=).

Truy cập các phần tử của một mảng Bash.

Truy cập các phần tử của một mảng Bash, chúng ta có thể sử dụng cú pháp sau:

echo ${ARRAY_NAME[2]}  

In ra mảng Bash

Chúng ta có thể sử dụng từ khóa ‘declare’ với tùy chọn ‘-p’ để in tất cả các phần tử của một mảng Bash với tất cả các chỉ mục và chi tiết. Cú pháp để in ra mảng Bash có thể được xác định như sau:

declare -p ARRAY_NAME  

Các phép toán với mảng

Sau khi một mảng được gán giá trị, chúng ta có thể thực hiện một số thao tác hữu ích trên nó. Chúng ta có thể hiển thị các khóa và giá trị của mảng cũng như sửa đổi nó bằng cách thêm hoặc xóa các phần tử:

Tham chiếu đến các phần tử

Để tham chiếu đến một phần tử đơn, chúng ta cần biết số chỉ mục của phần tử đó. Chúng ta có thể tham chiếu hoặc in ra bất kỳ phần tử nào bằng cú pháp sau:

${ARRAY_NAME[index]}  

Chú ý: Dấu ngoặc nhọn ${} được yêu cầu để tránh các toán tử mở rộng tên file của shell.

Ví dụ, hãy in ra một phần tử của một mảng có chỉ mục là 2:

#!/bin/bash  
#Script to print an element of an array with an index of 2  
  
#declaring the array  
declare -a example_array=( "Welcome""To""Javatpoint" )  
  
#printing the element with index of 2  
echo ${example_array[2]}  

Kết quả

Javatpoint

Nếu chúng ta sử dụng @ hoặc * thay vì chỉ mục được chỉ định, nó sẽ mở rộng đến tất cả các thành viên của mảng. Để in ra tất cả các phần tử, chúng ta có thể sử dụng định dạng sau:

#!/bin/bash  
#Script to print all the elements of the array  
  
#declaring the array  
declare -a example_array=( "Welcome""To""Javatpoint" )  
  
#Printing all the elements  
echo "${example_array[@]}"  

Kết quả

Welcome to Javatpoint

Sự khác biệt duy nhất giữa việc sử dụng @ và * là định dạng được bao quanh bởi dấu ngoặc kép khi sử dụng @. Trong trường hợp đầu tiên (khi sử dụng @), việc mở rộng cung cấp kết quả trong một từ cho mỗi phần tử của mảng. Nó có thể được mô tả tốt hơn với sự trợ giúp của “vòng lặp for”. Giả sử chúng ta có một mảng gồm ba phần tử, “Welcome”, “To” và “Javatpoint”:

$ example_array= (Welcome to Javatpoint)  

Áp dụng vòng lặp với @:

for i in "${example_array[@]}"; do echo "$i"; done  

Nó sẽ tạo ra kết quả sau:

Welcome
To
Javatpoint

Áp dụng vòng lặp với *, một kết quả duy nhất sẽ được tạo ra giữ tất cả các phần tử của mảng như một từ duy nhất:

Welcome To Javatpoint

Việc hiểu cách sử dụng @ và * là quan trọng vì nó hữu ích khi sử dụng định dạng để lặp lại các phần tử của mảng.

In ra các key của một mảng

Chúng ta cũng có thể lấy và in ra các key được sử dụng trong các mảng có chỉ mục hoặc kết hợp, thay vì các giá trị tương ứng của chúng. Điều này có thể được thực hiện bằng cách thêm toán tử ! trước tên mảng như sau:

${!ARRAY_NAME[index]}  

Ví dụ

#!/bin/bash  
#Script to print the keys of the array  
  
#Declaring the Array  
declare -a example_array=( "Welcome""To""Javatpoint" )  
  
#Printing the Keys  
echo "${!example_array[@]}"  

Kết quả

0  1  2

Chúng ta có thể đếm số lượng phần tử chứa trong mảng bằng cách sử dụng định dạng sau:

${#ARRAY_NAME[@]}  

Ví dụ:

#!/bin/bash  
  
#Declaring the Array  
declare -a example_array=( "Welcome""To""Javatpoint" )  
  
#Printing Array Length  
echo "The array contains ${#example_array[@]} elements"  

Kết quả

The array contains 3 elements

Phương pháp chung để lặp qua mỗi mục trong một mảng là bằng cách sử dụng ‘vòng lặp for’.

#!/bin/bash  
#Script to print all keys and values using loop through the array  
  
declare -a example_array=( "Welcome""To""Javatpoint" )  
  
#Array Loop  
for i in "${!example_array[@]}"  
do  
echo The key value of element "${example_array[$i]}" is "$i"  
done  

Kết quả

Một phương pháp phổ biến khác để lặp qua một mảng là lấy độ dài của mảng và sử dụng vòng lặp kiểu C như sau:

#!/bin/bash  
#Script to loop through an array in C-style  
  
declare -a example_array=( "Welcome""To""Javatpoint" )  
  
#Length of the Array  
length=${#example_array[@]}  
  
#Array Loop  
for (( i=0; i < ${length}; i++ ))  
do   
echo $i ${example_array[$i]}  
done  

Kết quả

Chúng ta có một tùy chọn để thêm các phần tử vào một mảng có chỉ mục hoặc kết hợp bằng cách chỉ định chỉ mục hoặc khóa kết hợp tương ứng của chúng. Để thêm phần tử mới vào một mảng trong bash, chúng ta có thể sử dụng định dạng sau:

ARRAY_NAME[index_n]="New Element"  

Ví dụ

#!/bin/bash  
  
#Declaring an array  
declare -a example_array=( "Java""Python""PHP""HTML" )  
  
#Adding new element  
example_array[4]="JavaScript"  
  
#Printing all the elements  
echo "${example_array[@]}"  

Kết quả

Java Python PHP HTML JavaScript

Phương pháp khác để thêm một phần tử mới vào một mảng là sử dụng toán tử +=. Không cần phải chỉ định chỉ mục trong phương pháp này. Chúng ta có thể thêm một hoặc nhiều phần tử trong mảng bằng cách sử dụng cách sau:

#!/bin/bash  
  
#Declaring the Array  
declare -a example_array=( "Java""Python""PHP" )  
  
#Adding new elements  
example_array+=( JavaScript CSS SQL )  
  
#Printing all the elements  
echo "${example_array[@]}"  

Chúng ta có thể cập nhật phần tử của một mảng bằng cách gán giá trị mới cho phần tử mảng hiện có bằng giá trị chỉ mục của nó. Hãy thay đổi phần tử mảng tại chỉ mục 4 thành phần tử ‘Javatpoint’.

#!/bin/bash  
#Script to update array element  
  
#Declaring the array  
declare -a example_array=( "We""welcome""you""on""SSSIT" )  
  
#Updating the Array Element  
example_array[4]=Javatpoint  
  
#Printig all the elements of the Array  
echo ${example_array[@]}  

Kết quả

We welcome you on Javatpoint

Nếu chúng ta muốn xóa phần tử khỏi mảng, chúng ta phải biết chỉ mục hoặc khóa của nó trong trường hợp của một mảng kết hợp. Một phần tử có thể bị xóa bằng cách sử dụng lệnh ‘unset’:

unset ARRAY_NAME[index]  

Một ví dụ được trình bày bên dưới để giúp bạn hiểu rõ hơn về khái niệm này:

#!/bin/bash  
#Script to delete the element from the array  
  
#Declaring the array  
declare -a example_array=( "Java""Python""HTML""CSS""JavaScript" )  
  
#Removing the element  
unset example_array[1]  
  
#Printing all the elements after deletion  
echo "${example_array[@]}"  

Kết quả

Java HTML CSS JavaScript

Ở đây, chúng ta đã tạo một mảng đơn giản gồm năm phần tử, “Java”, “Python”, “HTML”, “CSS” và “JavaScript”. Sau đó, chúng ta đã xóa phần tử “Python” khỏi mảng bằng cách sử dụng “unset” và tham chiếu đến chỉ số của nó. Chỉ số của phần tử “Python” là ‘1’, vì các mảng bash bắt đầu từ 0. Nếu chúng ta kiểm tra các chỉ số của mảng sau khi xóa phần tử, chúng ta có thể thấy rằng chỉ số cho phần tử đã xóa bị thiếu. Chúng ta có thể kiểm tra các chỉ số bằng cách thêm lệnh sau vào trong script:

echo ${!example_array[@]}  

Kết quả sẽ như sau:

0 2 3 4

Xóa toàn bộ mảng là một tác vụ rất đơn giản. Điều này có thể được thực hiện bằng cách truyền tên mảng làm đối số cho lệnh ‘unset’ mà không cần chỉ định chỉ mục hoặc khóa.

#!/bin/bash  
#Script to delete the entire Array  
  
#Declaring the Array  
declare -a example_array=( "Java""Python""HTML""CSS""JavaScript" )  
  
#Deleting Entire Array  
unset example_array  
  
#Printing the Array Elements  
echo ${!example_array[@]}  
  
#Printing the keys  
echo ${!example_array[@]}  

Kết quả

Cắt lát các phần tử của mảng

Các mảng trong Bash cũng có thể được cắt lát từ chỉ mục bắt đầu đến chỉ mục kết thúc.

Để cắt lát một mảng từ chỉ mục bắt đầu ‘m’ đến chỉ mục kết thúc ‘n’, chúng ta có thể sử dụng cú pháp sau:

SLICED_ARRAY=(${ARRAY_NAME[@]:m:n}")  

Ví dụ

#!/bin/bash  
#Script to slice Array Element from index 1 to index 3  
  
#Declaring the Array  
example_array=( "Java""Python""HTML""CSS""JavaScript" )  
  
#Slicing the Array   
sliced_array=("${example_array[@]:1:3}")  
  
#Applying for loop to iterate over each element in Array  
for i in "${sliced_array[@]}"  
do  
echo $i  
done  

Kết quả

LEAVE A REPLY

Please enter your comment!
Please enter your name here

4,956FansLike
256FollowersFollow
223SubscribersSubscribe
spot_img

Related Stories