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

Hướng dẫn về mảng Bash cuối cùng với 15 ví dụ

Mảng là một biến chứa nhiều giá trị có thể cùng kiểu hoặc khác kiểu. Không có giới hạn tối đa đối với kích thước của một mảng, cũng như không có bất kỳ yêu cầu nào về việc các biến thành viên phải được lập chỉ mục hoặc gán liền nhau. Chỉ mục mảng bắt đầu bằng số không.

Trong bài viết này, chúng ta hãy xem xét 15 phép toán mảng khác nhau trong bash.

Bài viết này là một phần của loạt bài Hướng dẫn về Bash đang thực hiện. Đối với những người mới làm quen với kịch bản bash, hãy bắt đầu ngay từ hướng dẫn Giới thiệu Bash Scripting.

1. Khai báo một mảng và gán giá trị

Trong bash, mảng được tạo tự động khi một biến được sử dụng ở định dạng như,

name[index]=value
  • tên là bất kỳ tên nào cho một mảng
  • index có thể là bất kỳ số hoặc biểu thức nào phải đánh giá thành một số lớn hơn hoặc bằng 0. Bạn có thể khai báo một mảng rõ ràng bằng cách sử dụng khai báo -a tên mảng.
$ cat arraymanip.sh
#! /bin/bash
Unix[0]='Debian'
Unix[1]='Red hat'
Unix[2]='Ubuntu'
Unix[3]='Suse'

echo ${Unix[1]}

$./arraymanip.sh
Red hat

Để truy cập một phần tử từ một mảng, hãy sử dụng dấu ngoặc nhọn như $ {name [index]}.

2. Khởi tạo một mảng trong khi khai báo

Thay vì khởi tạo từng phần tử của một mảng riêng biệt, bạn có thể khai báo và khởi tạo một mảng bằng cách chỉ định danh sách các phần tử (được phân tách bằng khoảng trắng) bằng dấu ngoặc nhọn.

Syntax:
declare -a arrayname=(element1 element2 element3)

Nếu các phần tử có ký tự khoảng trắng, hãy đặt nó trong dấu ngoặc kép.

#! /bin/bash
$cat arraymanip.sh
declare -a Unix=('Debian' 'Red hat' 'Red hat' 'Suse' 'Fedora');

khai báo -a khai báo một mảng và tất cả các phần tử trong dấu ngoặc đơn là các phần tử của một mảng.

3. In Toàn bộ Mảng Bash

Có nhiều cách khác nhau để in toàn bộ phần tử của mảng. Nếu số chỉ mục là @ hoặc *, tất cả các thành viên của một mảng đều được tham chiếu. Bạn có thể duyệt qua các phần tử của mảng và in nó bằng cách sử dụng các câu lệnh lặp trong bash.

echo ${Unix[@]}

# Add the above echo statement into the arraymanip.sh
#./t.sh
Debian Red hat Ubuntu Suse

Tham chiếu đến nội dung của biến thành viên của một mảng mà không cung cấp số chỉ mục cũng giống như tham chiếu đến nội dung của phần tử đầu tiên, phần tử được tham chiếu với chỉ số bằng không.

4. Độ dài của Mảng Bash

Chúng ta có thể lấy độ dài của một mảng bằng cách sử dụng tham số đặc biệt có tên là $ #.

$ {# arrayname [@]} cung cấp cho bạn độ dài của mảng.

$ cat arraymanip.sh
declare -a Unix=('Debian' 'Red hat' 'Suse' 'Fedora');
echo ${#Unix[@]} #Number of elements in the array
echo ${#Unix} #Number of characters in the first element of the array.i.e Debian
$./arraymanip.sh
4
6

5. Độ dài của phần tử thứ n trong một mảng

$ {# arrayname [n]} phải cung cấp độ dài của phần tử thứ n trong một mảng.

$cat arraymanip.sh
#! /bin/bash

Unix[0]='Debian'
Unix[1]='Red hat'
Unix[2]='Ubuntu'
Unix[3]='Suse'

echo ${#Unix[3]} # length of the element located at index 3 i.e Suse

$./arraymanip.sh
4

6. Trích xuất theo độ lệch và độ dài cho một mảng

Ví dụ sau đây cho thấy cách trích xuất 2 phần tử bắt đầu từ vị trí 3 từ một mảng có tên Unix.

$cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
echo ${Unix[@]:3:2}

$./arraymanip.sh
Suse Fedora

Ví dụ trên trả về các phần tử trong chỉ mục thứ 3 và chỉ mục thứ tư. Chỉ mục luôn bắt đầu bằng số không.

7. Trích xuất với độ lệch và độ dài, cho một phần tử cụ thể của một mảng

Để chỉ trích xuất bốn phần tử đầu tiên từ một phần tử mảng. Ví dụ:Ubuntu nằm ở chỉ mục thứ hai của một mảng, bạn có thể sử dụng độ lệch và độ dài cho một phần tử cụ thể của một mảng.

$cat arraymanip.sh
#! /bin/bash

Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
echo ${Unix[2]:0:4}

./arraymanip.sh
Ubun

Ví dụ trên trích xuất bốn ký tự đầu tiên từ phần tử được lập chỉ mục thứ hai của một mảng.

8. Tìm kiếm và Thay thế trong một phần tử mảng

Ví dụ sau, tìm kiếm Ubuntu trong một phần tử mảng và thay thế phần tử tương tự bằng từ ‘SCO Unix’.

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');

echo ${Unix[@]/Ubuntu/SCO Unix}

$./arraymanip.sh
Debian Red hat SCO Unix Suse Fedora UTS OpenLinux

Trong ví dụ này, nó thay thế phần tử trong chỉ mục thứ 2 ‘Ubuntu’ bằng ‘SCO Unix’. Nhưng ví dụ này sẽ không thay thế vĩnh viễn nội dung mảng.

9. Thêm một phần tử vào Mảng Bash hiện có

Ví dụ sau đây cho thấy cách thêm một phần tử vào mảng hiện có.

$cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Unix=("${Unix[@]}" "AIX" "HP-UX")
echo ${Unix[7]}

$./arraymanip.sh
AIX

Trong mảng có tên Unix, các phần tử ‘AIX’ và ‘HP-UX’ lần lượt được thêm vào trong chỉ mục thứ 7 và thứ 8.

10. Xóa một phần tử khỏi một mảng

unset được sử dụng để xóa một phần tử khỏi một mảng. unset sẽ có tác dụng tương tự như gán null cho một phần tử.

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');

unset Unix[3]
echo ${Unix[3]}

Tập lệnh trên sẽ chỉ in null là giá trị có sẵn trong chỉ mục thứ 3. Ví dụ sau đây cho thấy một trong những cách để xóa hoàn toàn một phần tử khỏi một mảng.

$ cat arraymanip.sh
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
pos=3
Unix=(${Unix[@]:0:$pos} ${Unix[@]:$(($pos + 1))})
echo ${Unix[@]}

$./arraymanip.sh
Debian Red hat Ubuntu Fedora UTS OpenLinux

Trong ví dụ này, $ {Unix [@]:0:$ pos} sẽ cung cấp cho bạn 3 phần tử bắt đầu từ chỉ mục thứ 0, tức là 0,1,2 và $ {Unix [@]:4} sẽ cung cấp cho bạn các phần tử từ chỉ mục thứ 4 đến chỉ số cuối cùng. Và hợp nhất cả hai kết quả trên. Đây là một trong những giải pháp để xóa một phần tử khỏi một mảng.

11. Loại bỏ các phần tử mảng Bash bằng cách sử dụng các mẫu

Trong điều kiện tìm kiếm, bạn có thể cung cấp các mẫu và lưu trữ phần tử còn lại vào một mảng khác như được hiển thị bên dưới.

$ cat arraymanip.sh
#!/bin/bash
declare -a Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora');
declare -a patter=( ${Unix[@]/Red*/} )
echo ${patter[@]}

$ ./arraymanip.sh
Debian Ubuntu Suse Fedora

Ví dụ trên loại bỏ các phần tử có hoa văn Màu đỏ *.

12. Sao chép một mảng

Mở rộng các phần tử của mảng và lưu trữ nó vào một mảng mới như được hiển thị bên dưới.

#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Linux=("${Unix[@]}")
echo ${Linux[@]}

$ ./arraymanip.sh
Debian Red hat Ubuntu Fedora UTS OpenLinux

13. Nối hai Mảng Bash

Mở rộng các phần tử của hai mảng và gán nó vào mảng mới.

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');

UnixShell=("${Unix[@]}" "${Shell[@]}")
echo ${UnixShell[@]}
echo ${#UnixShell[@]}

$ ./arraymanip.sh
Debian Red hat Ubuntu Suse Fedora UTS OpenLinux bash csh jsh rsh ksh rc tcsh
14

Nó in ra mảng có các phần tử của cả mảng ‘Unix’ và ‘Shell’ và số phần tử của mảng mới là 14.

14. Xóa toàn bộ mảng

unset được sử dụng để xóa toàn bộ một mảng.

$cat arraymanip.sh
#!/bin/bash
Unix=('Debian' 'Red hat' 'Ubuntu' 'Suse' 'Fedora' 'UTS' 'OpenLinux');
Shell=('bash' 'csh' 'jsh' 'rsh' 'ksh' 'rc' 'tcsh');

UnixShell=("${Unix[@]}" "${Shell[@]}")
unset UnixShell
echo ${#UnixShell[@]}

$ ./arraymanip.sh
0

Sau khi bỏ đặt một mảng, độ dài của nó sẽ bằng 0 như được hiển thị ở trên.

15. Tải nội dung của tệp vào một mảng

Bạn có thể tải nội dung của từng dòng tệp vào một mảng.

#Example file
$ cat logfile
Welcome
to
thegeekstuff
Linux
Unix

$ cat loadcontent.sh
#!/bin/bash
filecontent=( `cat "logfile" `)

for t in "${filecontent[@]}"
do
echo $t
done
echo "Read file content!"

$ ./loadcontent.sh
Welcome
to
thegeekstuff
Linux
Unix
Read file content!

Trong ví dụ trên, mỗi chỉ mục của một phần tử mảng đã được in qua vòng lặp for.

Đọc đề xuất

Hướng dẫn về mảng Bash cuối cùng với 15 ví dụ Bash 101 Hacks, bởi Ramesh Natarajan . Tôi dành phần lớn thời gian trên môi trường Linux. Vì vậy, dĩ nhiên tôi là một người rất hâm mộ dòng lệnh Bash và kịch bản shell. 15 năm trước, khi tôi làm việc trên các phiên bản * nix khác nhau, tôi đã từng viết rất nhiều mã trên C shell và Korn shell. Những năm sau đó, khi tôi bắt đầu làm việc trên Linux với tư cách là quản trị viên hệ thống, tôi đã tự động hóa mọi tác vụ có thể bằng cách sử dụng Bash shell scripting. Dựa trên kinh nghiệm sử dụng Bash của mình, tôi đã viết sách điện tử Bash 101 Hacks chứa 101 ví dụ thực tế về cả dòng lệnh Bash và kịch bản shell. Nếu bạn đang nghĩ đến việc thành thạo Bash, hãy tự giúp mình và đọc cuốn sách này, cuốn sách này sẽ giúp bạn kiểm soát dòng lệnh Bash và tập lệnh shell của mình.