Câu lệnh CASE

Nhập môn Bash Scripting

Alex Scriven

Data Scientist

Nhu cầu dùng CASE

CASE có thể tối ưu hơn IF khi có nhiều điều kiện hoặc điều kiện phức tạp.

Giả sử bạn muốn kiểm tra các điều kiện và hành động sau:

  • Nếu tệp chứa sydney thì chuyển vào thư mục /sydney
  • Nếu tệp chứa melbourne hoặc brisbane thì xóa tệp
  • Nếu tệp chứa canberra thì đổi tên thành IMPORTANT_filename, trong đó filename là tên gốc
Nhập môn Bash Scripting

IF phức tạp

Bạn có thể viết nhiều IF như sau:

  • Mã này gọi grep trên đối số ARGV đầu tiên để làm điều kiện.
if grep -q 'sydney' $1; then
    mv $1 sydney/
fi
if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi
if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi
  • Có vẻ rườm rà và lặp lại, đúng không?
Nhập môn Bash Scripting

Xây CASE statement

  • Bắt đầu bằng cách chọn biến hoặc chuỗi để so khớp
    • Bạn có thể gọi shell lồng trong shell!
  • Thêm bao nhiêu mẫu khớp và hành động tùy ý.
    • Có thể dùng regex cho PATTERN. Ví dụ Air* là 'bắt đầu bằng Air' hoặc *hat* là 'chứa hat'.
  • Nhớ ngăn cách mẫu và mã chạy bằng dấu ngoặc đóng và kết thúc lệnh bằng hai dấu chấm phẩy

Cú pháp CASE cơ bản:

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Nhập môn Bash Scripting

Xây CASE statement

  • *) DEFAULT COMMAND;;

    • Thường (không bắt buộc) kết thúc bằng lệnh mặc định chạy khi không khớp mẫu nào.
  • esac Cuối cùng, từ kết thúc là 'esac'

    • Đây là 'case' viết ngược!

Cú pháp CASE cơ bản:

case 'STRING' in
  PATTERN1)
  COMMAND1;;
  PATTERN2)
  COMMAND2;;

*) DEFAULT COMMAND;;
esac
Nhập môn Bash Scripting

Từ IF sang CASE

Câu lệnh IF cũ của chúng ta:

if grep -q 'sydney' $1; then
    mv $1 sydney/
fi

if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi

if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi

Câu lệnh CASE mới:

case $(cat $1) in

*sydney*) mv $1 sydney/ ;; *melbourne*|*brisbane*) rm $1 ;; *canberra*) mv $1 "IMPORTANT_$1" ;;
*) echo "No cities found" ;; esac
Nhập môn Bash Scripting

Vamos praticar!

Nhập môn Bash Scripting

Preparing Video For Download...