Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

Làm việc với mảng trong Linux Shell Scripting - Phần 8

Chúng ta không thể tưởng tượng một ngôn ngữ lập trình mà không có khái niệm về mảng. Không quan trọng chúng được triển khai như thế nào giữa các ngôn ngữ khác nhau. Thay vào đó, các mảng giúp chúng tôi hợp nhất dữ liệu, tương tự hoặc khác nhau, dưới một tên tượng trưng.

Làm việc với mảng trong Linux Shell Scripting - Phần 8

Ở đây, vì chúng tôi đang quan tâm đến kịch bản shell, bài viết này sẽ giúp bạn tìm hiểu một số tập lệnh shell sử dụng khái niệm mảng này.

Khởi tạo và sử dụng mảng

Với các phiên bản bash mới hơn, nó hỗ trợ mảng một chiều. Một mảng có thể được khai báo rõ ràng bằng khai báo shell-nội trang.

declare -a var  

Nhưng không nhất thiết phải khai báo biến mảng như trên. Chúng ta có thể chèn trực tiếp các phần tử riêng lẻ vào mảng như sau.

var[XX]=<value>

trong đó ‘XX’ biểu thị chỉ số mảng. Để bỏ qua các phần tử của mảng, hãy sử dụng cú pháp ngoặc nhọn, tức là

${var[XX]}

Lưu ý :Lập chỉ mục mảng luôn bắt đầu bằng 0.

Một cách thuận tiện khác để khởi tạo toàn bộ mảng là sử dụng cặp dấu ngoặc đơn như hình dưới đây.

var=( element1 element2 element3 . . . elementN )

Có một cách khác để gán giá trị cho mảng. Cách khởi tạo này là một danh mục con của phương thức đã giải thích trước đó.

array=( [XX]=<value> [XX]=<value> . . . )

Chúng tôi cũng có thể đọc / gán giá trị cho mảng trong thời gian thực thi bằng cách sử dụng read shell-nội trang.

read -a array

Bây giờ khi thực hiện câu lệnh trên bên trong một tập lệnh, nó sẽ đợi một số đầu vào. Chúng ta cần cung cấp các phần tử mảng được phân tách bằng dấu cách (và không phải ký tự xuống dòng). Sau khi nhập các giá trị, nhấn enter để kết thúc.

Để duyệt qua các phần tử mảng, chúng ta cũng có thể sử dụng vòng lặp for.

for i in “${array[@]}”
do
	#access each element as $i. . .
done 

Tập lệnh sau đây tóm tắt nội dung của phần cụ thể này.

#!/bin/bash 

array1[0]=one 
array1[1]=1 
echo ${array1[0]} 
echo ${array1[1]} 

array2=( one two three ) 
echo ${array2[0]} 
echo ${array2[2]} 

array3=( [9]=nine [11]=11 ) 
echo ${array3[9]} 
echo ${array3[11]} 

read -a array4 
for i in "${array4[@]}" 
do 
	echo $i 
done 

exit 0

Các hoạt động khác nhau trên Mảng

Nhiều hoạt động chuỗi tiêu chuẩn hoạt động trên mảng. Hãy xem tập lệnh mẫu sau đây thực hiện một số hoạt động trên mảng (bao gồm cả các hoạt động chuỗi).

#!/bin/bash 

array=( apple bat cat dog elephant frog ) 

#print first element 
echo ${array[0]} 
echo ${array:0} 

#display all elements 
echo ${array[@]} 
echo ${array[@]:0} 

#display all elements except first one 
echo ${array[@]:1} 

#display elements in a range 
echo ${array[@]:1:4} 

#length of first element 
echo ${#array[0]} 
echo ${#array} 

#number of elements 
echo ${#array[*]} 
echo ${#array[@]} 

#replacing substring 
echo ${array[@]//a/A} 

exit 0

Sau đây là kết quả được tạo ra khi thực thi tập lệnh trên.

apple 
apple 
apple bat cat dog elephant frog 
apple bat cat dog elephant frog 
bat cat dog elephant frog 
bat cat dog elephant 
5 
5 
6 
6 
Apple bAt cAt dog elephAnt frog

Tôi nghĩ rằng không có ý nghĩa gì trong việc giải thích chi tiết đoạn kinh trên vì nó là tự giải thích. Nếu cần, tôi sẽ dành riêng một phần trong loạt bài này về các thao tác trên chuỗi.

Thay thế lệnh bằng mảng

Thay thế lệnh gán đầu ra của một lệnh hoặc nhiều lệnh vào một ngữ cảnh khác. Ở đây, trong ngữ cảnh mảng này, chúng ta có thể chèn đầu ra của các lệnh dưới dạng các phần tử riêng lẻ của mảng. Cú pháp như sau.

array=( $(command) )

Theo mặc định, nội dung trong đầu ra của lệnh được phân tách bằng khoảng trắng được cắm vào mảng dưới dạng các phần tử riêng lẻ. Tập lệnh sau liệt kê nội dung của một thư mục, là các tệp có 755 quyền.

#!/bin/bash 

ERR=27 
EXT=0 

if [ $# -ne 1 ]; then 
	echo "Usage: $0 <path>" 
	exit $ERR 
fi 

if [ ! -d $1 ]; then 
	echo "Directory $1 doesn't exists" 
	exit $ERR 
fi 

temp=( $(find $1 -maxdepth 1 -type f) ) 

for i in "${temp[@]}" 
do 
	perm=$(ls -l $i) 
	if [ `expr ${perm:0:10} : "-rwxr-xr-x"` -eq 10 ]; then 
		echo ${i##*/} 
	fi 
done 

exit $EXT

Mô phỏng Mảng hai chiều

Chúng ta có thể dễ dàng biểu diễn ma trận 2 chiều bằng mảng 1 chiều. Trong thứ tự chính của hàng các phần tử biểu diễn trong mỗi hàng của ma trận được lưu trữ dần dần trong các chỉ mục mảng một cách tuần tự. Đối với ma trận mXn, công thức tương tự có thể được viết dưới dạng.

matrix[i][j]=array[n*i+j]

Xem một tập lệnh mẫu khác để thêm 2 ma trận và in ma trận kết quả.

#!/bin/bash 

read -p "Enter the matrix order [mxn] : " t 
m=${t:0:1} 
n=${t:2:1} 

echo "Enter the elements for first matrix" 
for i in `seq 0 $(($m-1))` 
do 
	for j in `seq 0 $(($n-1))` 
	do 
		read x[$(($n*$i+$j))] 
	done 
done 

echo "Enter the elements for second matrix" 
for i in `seq 0 $(($m-1))` 
do 
	for j in `seq 0 $(($n-1))` 
	do 
		read y[$(($n*$i+$j))] 
		z[$(($n*$i+$j))]=$((${x[$(($n*$i+$j))]}+${y[$(($n*$i+$j))]})) 
	done 
done 

echo "Matrix after addition is" 
for i in `seq 0 $(($m-1))` 
do 
	for j in `seq 0 $(($n-1))` 
	do 
		echo -ne "${z[$(($n*$i+$j))]}\t" 
	done 
	echo -e "\n" 
done 

exit 0 

Mặc dù có những hạn chế đối với việc triển khai các mảng bên trong kịch bản shell, nó trở nên hữu ích trong một số trường hợp, đặc biệt là khi chúng ta xử lý bằng cách thay thế lệnh. Nhìn từ quan điểm quản trị, khái niệm mảng đã mở đường cho sự phát triển của nhiều tập lệnh nền trong hệ thống GNU / Linux.