Bash Shell – Day 6 -Arrays

<< Day5Day 7 >>

Tiếp tục chuỗi bài viết trong 30 ngày tìm hiểu Bash Shell. Nội dung của ngày thứ 6 là tìm hiểu về Array- mảng trong Bash Shell.

Gán mảng

List Assignment – Gán vào list

Bash sử dụng dấu cách để phân tách các phần tử trong mảng:

[[email protected] ~]# array=(1 2 3 4)
[[email protected] ~]# echo ${array[2]}
3
[[email protected] ~]# echo ${array[*]}
1 2 3 4
[[email protected] ~]# city=("Ha Noi" "HCM" "Da Nang" "Hai Phong")
[[email protected] ~]# echo ${city[*]}
Ha Noi HCM Da Nang Hai Phong
[[email protected] ~]# echo ${city[0]}
Ha Noi
[[email protected] ~]# echo ${city[3]}
Hai Phong
[[email protected] ~]# echo ${city[-1]}
Hai Phong
[[email protected] ~]# echo ${city[-2]}
Da Nang
  • Trong dấu ngoặc vuông là thứ tự của phần trong mảng.
    • *: Lấy ra tất cả các phần tử trong mảng
    • Số nguyên dương là từ trái qua phải. Bắt đầu bằng 0 là phần tử đầu tiên
    • Số nguyên âm là lấy từ phải qua trải bắt đầu bằng -1

Subscript Assignment

Tạo phần tử với chỉ số rõ ràng:

array=([3]='fourth element' [4]='fifth element')

ví dụ:

[[email protected] ~]# city=([5]="Hue" [6]="Hung Yen")

Lưu ý: khi khai báo như trên thì các phần tử cũ sẽ bị xóa. Và khi gọi phải đúng tên số đã khai báo

Tạo mảng theo chỉ mục

[[email protected] ~]# array[0]='first element'
[[email protected] ~]# array[1]='second element'
[[email protected] ~]# echo ${array[1]}
second element

Tạo mảng theo tên

declare: Là một lệnh dựng sẵn của bash shell. Nó được sử dụng để khai báo các biến và hàm shell, thiết lập các thuộc tính của chúng và hiển thị các giá trị của chúng.

declare -A array1
array1[ho]='Nguyen'
array1[ten]='Abc'

Tạo mảng động.

  • Tạo một mảng từ đầu ra của lệnh khác,
[[email protected] ~]# array=(`seq 1 10`)
[[email protected] ~]# echo ${array[5]}
6
[[email protected] ~]# echo ${array[*]}
1 2 3 4 5 6 7 8 9 10

2 Truy cập các phần tử mảng

Khai báo mảng và phần tử trong mảng:

[[email protected] ~]# array=(`seq 1 10`)

In phần tử ở index 0

[[email protected] ~]# echo "${array[0]}"
1

Lấy ra phần tử ở vị trí đầu tiên

In phần tử cuối cùng bằng cú pháp mở rộng chuỗi con

In phần tử cuối cùng bằng cú pháp chỉ số

[[email protected] ~]# echo "${array[-1]}"
10

In tất cả các phần tử, mỗi phần tử được trích dẫn riêng biệt

[[email protected] ~]# echo "${array[@]}"
1 2 3 4 5 6 7 8 9 10

In tất cả các phần tử dưới dạng một chuỗi được trích dẫn duy nhất

[[email protected] ~]# echo "${array[*]}"
1 2 3 4 5 6 7 8 9 10

In tất cả các phần tử từ chỉ mục 1, mỗi phần tử được trích dẫn

[[email protected] ~]# echo "${array[@]:1}"
2 3 4 5 6 7 8 9 10
[[email protected] ~]# echo "${array[@]:3}"
4 5 6 7 8 9 10

Đối số sau dấu : là số phần tự bị bỏ qua

In 3 phần tử từ chỉ mục 1, mỗi phần tử được trích dẫn riêng biệt

[[email protected] ~]# echo "${array[@]:1:3}"
2 3 4
[[email protected] ~]# echo "${array[@]:4:9}"
5 6 7 8 9 10

Lấy ra các phần tử chỉ định từ 1:3 hoặc từ 4:9. Đưa

Hoạt động chuỗi

Nếu tham chiếu đến một phần tử, các phép toán chuỗi vd:

[[email protected] ~]# array=(zero one two bashshell )

  • echo "${array[0]:0:3}": Lấy ra phần tử đầu tiên, trong đó 0 khởi đầu và lấy 3 ký tự trong phần tử để in ra
[[email protected] ~]# echo "${array[0]:0:3}"
zer
  • echo "${array[3]:3:4}": Lấy ra phần tử thứ 4, và bắt đầu lấy từ vị trí thứ 2 và lấy 4 ký tự.
[[email protected] ~]# echo "${array[3]:2:4}"
shsh

3 Sửa đổi mảng.

Change Index

Sửa đổi hoặc nhập một phần tử cụ thể trong mảng:

[[email protected] ~]# array[1]="number one"
[[email protected] ~]# echo "${array[1]}"
number one

Phần tử array[1]=one thay thế nó bằng array[1]=”number one”

Nối tiếp

Sửa đổi mảng, thêm phần tử vào cuối nếu không có chỉ số con nào được chỉ định

array+=('new1' 'new2')

Thay thế toàn bộ mảng bằng một danh sách tham số mới.

array=("${array[@]}" "new1" "new2")

Chèn một phần tử ở đầu tiên

array=("new With Begin" "${array[@]}")

Chèn một phần tử tại một vị trí nhất định

[[email protected] ~]# arr=(a b c d)
[[email protected] ~]# arr=("${arr[@]:0:2}" 'new' "${arr[@]:2}")
[[email protected] ~]# echo "${arr[*]}"
a b new c d

Xóa phần tử chỉ định

[[email protected] ~]# num=(12 14 16)
[[email protected] ~]# echo "${num[@]}"
12 14 16
[[email protected] ~]# echo "${!num[@]}" # In ra vị trí
0 1 2
[[email protected] ~]#  unset -v 'num[1]' # Xóa ở vị trị 1
[[email protected] ~]# echo "${num[@]}" 
12 16
[[email protected] ~]# echo "${!num[@]}"
0 2

Hợp nhất chuỗi

array3=("${array1[@]}" "${array2[@]}")

Ví dụ:

[[email protected] ~]# echo "${arr[@]}"
a new new c d
[[email protected] ~]# echo "${num[@]}"
12 16
[[email protected] ~]# arr_1=("${arr[@]}" "${num[@]}")
[[email protected] ~]# echo "${arr_1[@]}"
a new new c d 12 16
[[email protected] ~]# echo "${!arr_1[@]}"
0 1 2 3 4 5 6

Lập lại chỉ mục một mảng.

Điều này hữu ích nếu mạng của bạn bị xóa và chỉ số chỉ mục index không theo một chuỗi nhất đinh. và bạn muốn sắp xếp lại theo tuần tự

array=("${array[@]}")

4 Lặp lại mảng

Có 2 loại foreach và for-loop:

Cho mảng num = (1 2 3 4 5)

  • Vòng lặp foreach:
for y in "${a[@]}"; do
    echo "$y"
done
  • for-loop:
for ((idx=0; idx < ${#a[@]}; ++idx)); do
    echo "${a[$idx]}"
done

5 Độ dài của mảng

[[email protected] ~]# array=('first element' 'second element' 'third element')
[[email protected] ~]# echo "${#array[@]}"
3
[[email protected] ~]# echo "${array[@]}"
first element second element third element
[[email protected] ~]# echo "${#array[@]}"
3
[[email protected] ~]# echo "${!array[@]}"
0 1 2
  • In ra số ký tự của phần tử:
[[email protected] ~]# echo "${#array[0]}" 
13
[[email protected] ~]# echo "${#array[1]}" 
14

6 Mảng liên kết

Khai báo mảng liên kết là bắt buộc

declare -A aa
aa[say]=hello
aa[cmd]=ls
aa["Key world"]="Hello World"

Hoặc:

declare -A aa
aa=([say]=hello [cmd]=ls ["Key world"]="Hello World")

Truy cập phần tử của mảng kết hợp

[[email protected] ~]# echo ${aa[say]}
hello
[[email protected] ~]# echo ${aa[cmd]}
ls

Lấy ra tất cả các key của mảng kết hợp

[[email protected] ~]# echo "${!aa[@]}"
say Key world cmd

Lấy các value của mảng kết hợp

[[email protected] ~]# echo "${aa[@]}"
hello Hello World ls

Lấy ra cả key và value của mảng kết hợp

for key in "${!aa[@]}"; do
    echo  ${key} : ${aa[$key]}
done

output:

[[email protected] ~]# for key in "${!aa[@]}"; do
>     echo  ${key} : ${aa[$key]}
> done
say : hello
Key world : Hello World
cmd : ls

7 Vòng lặp qua một mảng.

arr=(a b c d e f)

  • Sử dụng vòng lặp for. Cho i chạy trong mảng arr và in ra i.
for i in "${arr[@]}"; do
 echo "$i"
done

output:

[[email protected] ~]# ./file1.sh 
a
b
c
d
e
f
  • Sử dụng while, $i khi nào nhỏ hơn hoặc bằng chỉ mục có trong mảng thì dừng lại:
i=0
while [ $i -lt ${#arr[@]} ]; do
 echo "${arr[$i]}"
 i=$((i + 1))
done

hoặc:

i=0
while (( $i < ${#arr[@]} )); do
 echo "${arr[$i]}"
 ((i++))
done

Output

[[email protected] ~]# ./file1.sh 
a
b
c
d
e
f

Sử dụng vòng lặp Until, Chạy cho đến khi nào i mà bằng số lượng thành phần thì dừng lại:

i=0
until [ $i -ge ${#arr[@]} ]; do
 echo "${arr[$i]}"
 i=$((i + 1))
done

8 Destroy, Delete, unset một mảng

unset array

Xóa hủy ở một vị trí chỉ định:

unset array[10]

Mảng từ chuỗi

stringVar="Apple Orange Banana Mango"
arrayVar=(${stringVar// / })

Câu lệnh dùng để tách thành các biến nhỏ

[[email protected] ~]# echo ${!stringVar[*]}
0
[[email protected] ~]# echo ${!arrayVar[*]}
0 1 2 3
  • $stringVar chỉ có 1 chỉ mục duy nhất
  • ${stringVar// / }: chuỗi được phân chăc nhau bởi khoảng trắng thì tác làm các chỉ mục độc lập. $arrayVar có 4 chỉ mục độc lập.

Ví dụ tương tự:

[[email protected] ~]# stringVar="Apple+Orange+Banana+Mango"
[[email protected] ~]# arrayVar=(${stringVar//+/ })
[[email protected] ~]# echo ${arrayVar[0]}
Apple
[[email protected] ~]# echo ${arrayVar[3]}
Mango

10 Đọc toàn bộ tệp thành một mảng

Đọc trong một bước duy nhất

Sử dụng mapfile hoặc readarray:

mapfile -t arr < file

hoặc

readarray -t arr < file

Từ dữ liệu từ file để đưa vào biến, mỗi dòng trong file được phân tách làm 1 biến.

11 Đọc trong vòng lặp

arr=()
while IFS= read -r line; do
 arr+=("$line")
done

Thực hiện nhập dữ liệu phân tách khi xuống dòng, để thực hiện dừng lại Ctr Z.

Cám ơn các bạn đã theo dõi chuỗi bài viết. Đọc tiếp Day 7.

Leave a Comment