Câu lệnh Bash shell tương tự như câu lệnh switch trong C. Nó có thể được sử dụng để kiểm tra các giá trị đơn giản như số nguyên và ký tự.
Câu lệnh trường hợp không phải là một vòng lặp, nó không thực thi một khối mã trong n số lần. Thay vào đó, bash shell sẽ kiểm tra điều kiện và kiểm soát luồng của chương trình.
Trong bài viết này, chúng ta hãy xem lại lệnh bash case với 5 ví dụ thực tế.
Cấu trúc trường hợp trong bash shell cho phép chúng tôi kiểm tra các chuỗi dựa trên các mẫu có thể chứa các ký tự thẻ đại diện. Câu lệnh bash case là dạng đơn giản nhất của câu lệnh bash if-then-else.
Cú pháp của câu lệnh viết hoa bash.
case expression in pattern1 ) statements ;; pattern2 ) statements ;; ... esac
Sau đây là những điểm chính của câu lệnh bash case:
- Trước tiên, câu lệnh viết hoa mở rộng biểu thức và cố gắng khớp biểu thức đó với từng mẫu.
- Khi tìm thấy kết quả khớp, tất cả các câu lệnh liên quan cho đến khi dấu chấm phẩy kép (;;) được thực thi.
- Sau lần so khớp đầu tiên, trường hợp kết thúc với trạng thái thoát của lệnh cuối cùng được thực thi.
- Nếu không khớp, trạng thái thoát của trường hợp bằng không.
Ví dụ về trường hợp Bash 1. Gửi tín hiệu đến một quá trình
Tập lệnh sau chấp nhận số tín hiệu và id quy trình làm đối số của nó và gửi tín hiệu đến một id quy trình nhất định bằng cách sử dụng tên tín hiệu.
Tập lệnh này để chứng minh cách sử dụng câu lệnh trường hợp.
$ cat signal.sh #!/bin/bash if [ $# -lt 2 ] then echo "Usage : $0 Signalnumber PID" exit fi case "$1" in 1) echo "Sending SIGHUP signal" kill -SIGHUP $2 ;; 2) echo "Sending SIGINT signal" kill -SIGINT $2 ;; 3) echo "Sending SIGQUIT signal" kill -SIGQUIT $2 ;; 9) echo "Sending SIGKILL signal" kill -SIGKILL $2 ;; *) echo "Signal number $1 is not processed" ;; esac
Trong ví dụ trên:
- $ 1 và $ 2 lần lượt là số tín hiệu và id quy trình.
- Sử dụng lệnh kill, nó sẽ gửi tín hiệu tương ứng đến id quy trình đã cho.
- Nó thực hiện lệnh ngủ trong một số giây.
- So sánh cuối cùng tùy chọn *) là trường hợp mặc định và phù hợp với bất kỳ điều gì.
Cách sử dụng tập lệnh shell ở trên:Tìm hiểu id quy trình của lệnh ngủ và gửi tín hiệu hủy tới id quy trình đó để hủy quy trình.
$ sleep 1000 $ ps -a | grep sleep 23277 pts/2 00:00:00 sleep $ ./signal.sh 9 23277 Sending SIGKILL signal $ sleep 1000 Killed
Ngoài ra, hãy tham khảo bài viết tiêu diệt trước đó của chúng tôi - 4 phương pháp để tiêu diệt một quy trình.
Ví dụ về trường hợp Bash. 2. Khớp mẫu trong tệp
Ví dụ này in số dòng, số từ và xóa các dòng phù hợp với mẫu đã cho.
$ cat fileop.sh #!/bin/bash # Check 3 arguments are given # if [ $# -lt 3 ] then echo "Usage : $0 option pattern filename" exit fi # Check the given file is exist # if [ ! -f $3 ] then echo "Filename given \"$3\" doesn't exist" exit fi case "$1" in # Count number of lines matches -i) echo "Number of lines matches with the pattern $2 :" grep -c -i $2 $3 ;; # Count number of words matches -c) echo "Number of words matches with the pattern $2 :" grep -o -i $2 $3 | wc -l ;; # print all the matched lines -p) echo "Lines matches with the pattern $2 :" grep -i $2 $3 ;; # Delete all the lines matches with the pattern -d) echo "After deleting the lines matches with the pattern $2 :" sed -n "/$2/!p" $3 ;; *) echo "Invalid option" ;; esac
Việc thực thi tập lệnh trên được hiển thị bên dưới.
$ cat text Vim is a text editor released by Bram Moolenaar in 1991 for the Amiga computer. The name "Vim" is an acronym for "Vi IMproved" because Vim was created as an extended version of the vi editor, with many additional features designed to be helpful in editing program source code. Although Vim was originally released for the Amiga, Vim has since been developed to be cross-platform, supporting many other platforms. It is the most popular editor amongst Linux Journal readers.
Bash case regex đầu ra. Sau khi xóa các dòng phù hợp với mẫu Vim:
$ ./fileop.sh -d Vim text It is the most popular editor amongst Linux Journal readers.
Ngoài ra, hãy tham khảo bài viết trước đây của chúng tôi về Bash ~ expansaion và {} mở rộng.
Ví dụ về trường hợp Bash 3. Tìm loại tệp từ Phần mở rộng
Ví dụ này in loại tệp (văn bản, Csource, v.v.) dựa trên phần mở rộng của tên tệp.
$ cat filetype.sh #!/bin/bash for filename in $(ls) do # Take extension available in a filename ext=${filename##*\.} case "$ext" in c) echo "$filename : C source file" ;; o) echo "$filename : Object file" ;; sh) echo "$filename : Shell script" ;; txt) echo "$filename : Text file" ;; *) echo " $filename : Not processed" ;; esac done $ ./filetype.sh a.c : C source file b.c : C source file c1.txt : Text file fileop.sh : Shell script obj.o : Object file text : Not processed t.o : Object file
Ví dụ về Bash Case 4. Nhắc người dùng bằng Có hoặc Không
Trong hầu hết các cài đặt phần mềm, trong quá trình thỏa thuận cấp phép, nó sẽ yêu cầu người dùng nhập vào có hoặc không. Đoạn mã sau là một trong những cách để nhận được thông tin đầu vào có hoặc không từ người dùng.
$ cat yorno.sh #!/bin/bash echo -n "Do you agree with this? [yes or no]: " read yno case $yno in [yY] | [yY][Ee][Ss] ) echo "Agreed" ;; [nN] | [n|N][O|o] ) echo "Not agreed, you can't proceed the installation"; exit 1 ;; *) echo "Invalid input" ;; esac $ ./yorno.sh Do you agree with this? [yes or no]: YES Agreed
Nếu có một số mẫu được phân tách bằng ký tự ống dẫn, biểu thức có thể khớp với bất kỳ mẫu nào trong số chúng để chạy các câu lệnh liên quan. Các mẫu được kiểm tra theo thứ tự cho đến khi tìm thấy kết quả phù hợp; nếu không tìm thấy, không có gì xảy ra.
Ngoài ra, hãy tham khảo bài viết 15 ví dụ về mảng bash trước đó của chúng tôi.
Ví dụ về trường hợp Bash 5. Tập lệnh khởi động
Các tập lệnh khởi động trong thư mục /etc/init.d sử dụng câu lệnh trường hợp để khởi động và dừng ứng dụng.
Bạn có thể sử dụng bất kỳ loại mẫu nào, nhưng luôn được khuyến khích sử dụng câu lệnh trường hợp, khi bạn đang kiểm tra các giá trị của nguyên mẫu. (tức là. số nguyên hoặc ký tự).
$ cat startpcapp #!/bin/bash case "$1" in 'start') echo "Starting application" /usr/bin/startpc ;; 'stop') echo "Stopping application" /usr/bin/stoppc ;; 'restart') echo "Usage: $0 [start|stop]" ;; esac $ ./startpcapp start Starting application /usr/bin/startpc started
Đọc đề xuất
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.