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ả