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.