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:

[root@hdv ~]# array=(1 2 3 4)
[root@hdv ~]# echo ${array[2]}
3
[root@hdv ~]# echo ${array[*]}
1 2 3 4
[root@hdv ~]# city=("Ha Noi" "HCM" "Da Nang" "Hai Phong")
[root@hdv ~]# echo ${city[*]}
Ha Noi HCM Da Nang Hai Phong
[root@hdv ~]# echo ${city[0]}
Ha Noi
[root@hdv ~]# echo ${city[3]}
Hai Phong
[root@hdv ~]# echo ${city[-1]}
Hai Phong
[root@hdv ~]# 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ụ:

[root@hdv ~]# 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

[root@hd ~]# array[0]='first element'
[root@hd ~]# array[1]='second element'
[root@hd ~]# 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,
[root@hd ~]# array=(`seq 1 10`)
[root@hd ~]# echo ${array[5]}
6
[root@hd ~]# 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:

[root@hd ~]# array=(`seq 1 10`)

In phần tử ở index 0

[root@hd ~]# 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ố

[root@hd ~]# 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

[root@hd ~]# 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

[root@hd ~]# 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

[root@hd ~]# echo "${array[@]:1}"
2 3 4 5 6 7 8 9 10
[root@hd ~]# 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

[root@hd ~]# echo "${array[@]:1:3}"
2 3 4
[root@hd ~]# 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:

[root@hd ~]# 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
[root@hd ~]# 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ự.
[root@hd ~]# 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:

[root@hd ~]# array[1]="number one"
[root@hd ~]# 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

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

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

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

Hợp nhất chuỗi

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

Ví dụ:

[root@hd ~]# echo "${arr[@]}"
a new new c d
[root@hd ~]# echo "${num[@]}"
12 16
[root@hd ~]# arr_1=("${arr[@]}" "${num[@]}")
[root@hd ~]# echo "${arr_1[@]}"
a new new c d 12 16
[root@hd ~]# 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

[root@hd ~]# array=('first element' 'second element' 'third element')
[root@hd ~]# echo "${#array[@]}"
3
[root@hd ~]# echo "${array[@]}"
first element second element third element
[root@hd ~]# echo "${#array[@]}"
3
[root@hd ~]# echo "${!array[@]}"
0 1 2
  • In ra số ký tự của phần tử:
[root@hd ~]# echo "${#array[0]}" 
13
[root@hd ~]# 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

[root@hd ~]# echo ${aa[say]}
hello
[root@hd ~]# echo ${aa[cmd]}
ls

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

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

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

[root@hd ~]# 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:

[root@hd ~]# 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:

[root@hd ~]# ./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

[root@hd ~]# ./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ỏ

[root@hd ~]# echo ${!stringVar[*]}
0
[root@hd ~]# 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ự:

[root@hd ~]# stringVar="Apple+Orange+Banana+Mango"
[root@hd ~]# arrayVar=(${stringVar//+/ })
[root@hd ~]# echo ${arrayVar[0]}
Apple
[root@hd ~]# 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