No menu items!
No menu items!
More

    [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ả

    Bài viết gần đây

    spot_img

    Related Stories

    Leave A Reply

    Please enter your comment!
    Please enter your name here

    Đăng ký nhận thông tin bài viết qua email