Mảng trong Bash

Nhập môn Bash Scripting

Alex Scriven

Data Scientist

Mảng là gì?

Hai loại mảng trong Bash:

  • Mảng
    • Cấu trúc chỉ mục số “thường”.
    • Gọi là “list” trong Python hoặc “vector” trong R.

Trong Python: my_list = [1,3,2,4]

Trong R: my_vector <- c(1,3,2,4)

Nhập môn Bash Scripting

Tạo mảng trong Bash

Tạo mảng chỉ mục số có hai cách trong Bash.

  1. Khai báo trước, chưa thêm phần tử
declare -a my_first_array
  1. Tạo và thêm phần tử cùng lúc
my_first_array=(1 2 3)

Nhớ: không có khoảng trắng quanh dấu bằng!

Nhập môn Bash Scripting

Cẩn thận với dấu phẩy!

Không dùng dấu phẩy để tách phần tử mảng trong Bash:

Cách này không đúng:

my_first_array=(1, 2, 3)

Cách này đúng:

my_first_array=(1 2 3)
Nhập môn Bash Scripting

Thuộc tính quan trọng của mảng

  • Trả về toàn bộ phần tử bằng array[@]. Lưu ý: Bash yêu cầu ngoặc nhọn quanh tên mảng khi truy cập thuộc tính này.
my_array=(1 3 5 2)
echo ${my_array[@]}
1 3 5 2
  • Độ dài mảng truy cập bằng #array[@]
echo ${#my_array[@]}
4
Nhập môn Bash Scripting

Thao tác phần tử mảng

Truy cập phần tử mảng bằng ngoặc vuông.

my_first_array=(15 20 300 42)
echo ${my_first_array[2]}
300
  • Lưu ý: Bash đánh số từ 0 như Python (khác R!)
Nhập môn Bash Scripting

Thao tác phần tử mảng

Gán phần tử mảng bằng cú pháp chỉ mục.

my_first_array=(15 20 300 42 23 2 4 33 54 67 66)

my_first_array[0]=999
echo ${my_first_array[0]}
999
  • Lưu ý: không dùng $ khi ghi đè chỉ mục như $my_first_array[0]=999, vì sẽ không hoạt động.
Nhập môn Bash Scripting

Thao tác phần tử mảng

Dùng cú pháp array[@]:N:M để cắt (slice) một phần mảng.

  • N là chỉ mục bắt đầu, M là số phần tử trả về.
my_first_array=(15 20 300 42 23 2 4 33 54 67 66)
echo ${my_first_array[@]:3:2}
42 23
Nhập môn Bash Scripting

Thêm phần tử vào mảng

Thêm vào mảng bằng array+=(elements).

Ví dụ:

my_array=(300 42 23 2 4 33 54 67 66)

my_array+=(10) echo ${my_array[@]}
300 42 23 2 4 33 54 67 66 10
Nhập môn Bash Scripting

(Không) thêm vào mảng

Nếu không đặt trong ngoặc tròn khi thêm thì sao? Xem thử.

Ví dụ:

my_array=(300 42 23 2 4 33 54 67 66)
my_array+=10
echo ${my_array[@]}
30010 42 23 2 4 33 54 67 66

Chuỗi 10 sẽ dính vào phần tử đầu tiên. Không như mong muốn!

Nhập môn Bash Scripting

Mảng kết hợp

  • Mảng kết hợp
    • Tương tự mảng thường, nhưng dùng cặp khóa-giá trị, không phải chỉ mục số
    • Giống dictionary của Python hoặc list của R
    • Lưu ý: Chỉ có từ Bash 4 trở lên. Một số máy Mac mới vẫn có Bash cũ! Kiểm tra bằng bash --version trong terminal

Trong Python:

my_dict = {'city_name': "New York", 'population': 14000000}

Trong R:

my_list = list(city_name = c('New York'), population = c(14000000))
Nhập môn Bash Scripting

Tạo mảng kết hợp

Chỉ có thể tạo mảng kết hợp bằng cú pháp declare (với -A viết hoa).

Có thể declare trước rồi thêm phần tử, hoặc làm trên một dòng.

  • Bao khóa trong ngoặc vuông, rồi gán giá trị sau dấu bằng.
    • Có thể thêm nhiều phần tử một lúc.
Nhập môn Bash Scripting

Ví dụ mảng kết hợp

Tạo một mảng kết hợp:

declare -A city_details # Khai báo trước

city_details=([city_name]="New York" [population]=14000000) # Thêm phần tử
echo ${city_details[city_name]} # Truy cập bằng khóa để lấy giá trị
New York
Nhập môn Bash Scripting

Tạo mảng kết hợp

Cách khác: tạo mảng kết hợp và gán trên một dòng

  • Các thao tác còn lại giống nhau
declare -A city_details=([city_name]="New York" [population]=14000000)

Lấy “khóa” của mảng kết hợp với !

echo ${!city_details[@]} # Trả về tất cả khóa
city_name population
Nhập môn Bash Scripting

Ayo berlatih!

Nhập môn Bash Scripting

Preparing Video For Download...