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.
Ở đâ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.