Ham case trong linux

Trong bài này chúng ta sẽ tìm hiểu lệnh case .. esac trong shell script, đây là lệnh rẻ nhánh có công dụng như lệnh if else.

Ham case trong linux

Ham case trong linux

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Nếu bạn đã từng học một ngôn ngữ lập trình bất kì thì sẽ thấy đây chính là lệnh switch case, chỉ là cú pháp trong shell script có khác biệt hơn mà thôi.

1. Cú pháp lệnh case .. esac trong shell script

Thực tế bạn có thể sử dụng lệnh if else để xử lý theo nhiều luồng khác nhau, tuy nhiên không phải lúc nào nó cũng tốt, nhất là trường hợp tất cả các luồng đều phụ thuộc vào một giá trị. Và trong trường hợp này bạn nên sử dụng lệnh case .. esac.

Cú pháp:

Bài viết này được đăng tại [free tuts .net]

case word in
   pattern1)
      Statement(s) 
      ;;
   pattern2)
      Statement(s) 
      ;;
   pattern3)
      Statement(s) 
      ;;
   *)
     Default 
     ;;
esac

Trong đó:

  • word chính là giá trị mà bạn muốn dùng để rẻ nhánh chương trình thành nhiều luồng.
  • pattern1), pattern2), ... chính là các nhánh cho mỗi trường hợp,
  • Default sẽ được chạy nếu không có nhánh nào ở trên phù hợp.

2. Ví dụ lệnh case .. esac trong shell script

Bây giờ ta sẽ làm một vài ví dụ đơn giản nhất để bạn hiểu hơn về lệnh này nhé.

Ví dụ 1: In ra màn hình thông tin của trái cây

Live Demo
#!/bin/sh

FRUIT="kiwi"

case "$FRUIT" in
   "apple") echo "An tao rat ngon." 
   ;;
   "banana") echo "Chuoi nhieu chat dinh duong." 
   ;;
   "kiwi") echo "Kiwi noi tieng o New Zealand" 
   ;;
esac

Cú pháp nó hơi rườm rà so với những ngôn ngữ lập trình như C, C++, PHP.

Khi chạy chương trình trên bạn sẽ thu được kết quả là "Kiwi noi tieng o New Zealand" bởi biến FRUIT = "kiwi".

Ví dụ 2: Viết chương trình đọc thông tin của file dựa vào tham số truyền vào của người dùng.

Bạn hãy tạo một file test.sh với nội dung như sau.

#!/bin/sh

option="${1}" 
case ${option} in 
   -f) FILE="${2}" 
      echo "File name is $FILE"
      ;; 
   -d) DIR="${2}" 
      echo "Dir name is $DIR"
      ;; 
   *)  
      echo "`basename ${0}`:usage: [-f file] | [-d directory]" 
      exit 1 # Command to come out of the program with status 1
      ;; 
esac 

Ví dụ này sẽ trả về thông tin của file như:

  • Hiển thị file name nếu tham số là -f
  • Hiển thị tên thư mục nếu tham số là -d
  • Hiển thị thông báo nếu không có tham số

Dưới đây là một vài đoạn test chạy thực tế.

$./test.sh
test.sh: usage: [ -f filename ] | [ -d directory ]
$ ./test.sh -f index.htm
$ vi test.sh
$ ./test.sh -f index.htm
File name is index.htm
$ ./test.sh -d unix
Dir name is unix
$

Trên là thông tin cơ bản về cách sử dụng lệnh case .. esac trong shell script. Nếu trong các ngôn ngữ lập trình như PHP, C, C++ ít sử dụng thì trong shell script lại sử dụng rất nhiều đấy nhé.



Bạn có thể sử dụng nhiều lệnh if…elif để thực hiện nhiều nhánh lựa chọn. Tuy nhiên, nó luôn luôn không phải là giải pháp tốt nhất, đặc biệt khi tất cả các nhánh phụ thuộc vào giá trị của một biến đơn.

Shell hỗ trợ lệnh case…esac mà xử lý tình huống này một cách chính xác, và nó thực hiện một cách hiệu quả hơn là việc lặp đi lặp lại các lệnh if…elif.

Cú pháp trong Unix/Linux

Cú pháp đơn giản của lệnh case…esac là cung cấp một biểu thức để ước lượng và một số lệnh khác nhau để thực thi dựa trên cơ sở giá trị của biểu thức.

Bộ phiên dịch kiểm tra mỗi case – trường hợp ứng với giá trị của biểu thức tới khi tìm thấy sự so khớp. Nếu không có sự so khớp, điều kiện mặc định sẽ được sử dụng.

case word in
  pattern1)
     cac lenh de thuc thi neu ket noi voi pattern1
     ;;
  pattern2)
     cac lenh de thuc thi neu ket noi voi pattern2
     ;;
  pattern3)
     cac lenh de thuc thi neu ket noi voi pattern3
     ;;
esac

Quảng cáo

Ở đây, chuỗi word được so sánh với mỗi pattern cho tới khi tìm thấy một sự so khớp. Các lệnh theo sau pattern được so khớp này thực hiện. Nếu không tìm thấy sự so khớp nào, lệnh case thoát ra mà không thực hiện bất kỳ hành động nào.

Sẽ không giới hạn số lượng các pattern, nhưng số lượng tối thiểu là 1.

Khi các phần lệnh thực thi, lệnh ;; chỉ dẫn rằng dòng chương trình nên nhảy tới phần cuối của lệnh case. Nó tương tự như lệnh break trong Ngôn ngữ chương trình C.

Ví dụ trong Unix/Linux

#!/bin/sh

FRUIT="kiwi"

case "$FRUIT" in
   "apple") echo "Apple pie is quite tasty." 
   ;;
   "banana") echo "I like banana nut bread." 
   ;;
   "kiwi") echo "New Zealand is famous for kiwi." 
   ;;
esac

Nó sẽ cho kết quả sau:

New Zealand is famous for kiwi.

Một cách sử dụng tốt cho một lệnh case là sự ước lượng các tham số dòng lệnh như sau:

#!/bin/sh

option="1" 
case  in 
   -f) FILE="2" 
      echo "File name is $FILE"
      ;; 
   -d) DIR="2" 
      echo "Dir name is $DIR"
      ;; 
   *)  
      echo "`basename 0`:usage: [-f file] | [-d directory]" 
      exit 1 # Command to come out of the program with status 1
      ;; 
esac 

Quảng cáo

Dưới đây là kết quả mẫu của chương trình này.

$./test.sh
test.sh: usage: [ -f filename ] | [ -d directory ]
$ ./test.sh -f index.jsp
$ vi test.sh
$ ./test.sh -f index.jsp
File name is index.jsp
$ ./test.sh -d unix
Dir name is unix
$

Đã có app VietJack trên điện thoại, giải bài tập SGK, SBT Soạn văn, Văn mẫu, Thi online, Bài giảng....miễn phí. Tải ngay ứng dụng trên Android và iOS.

Ham case trong linux

Ham case trong linux

Theo dõi chúng tôi miễn phí trên mạng xã hội facebook và youtube:

Follow fanpage của team https://www.facebook.com/vietjackteam/ hoặc facebook cá nhân Nguyễn Thanh Tuyền https://www.facebook.com/tuyen.vietjack để tiếp tục theo dõi các loạt bài mới nhất về Java,C,C++,Javascript,HTML,Python,Database,Mobile.... mới nhất của chúng tôi.

Các bài học UNIX phổ biến khác tại VietJack:

  • Quản lý File
  • Thư mục
  • Quyền truy cập File
  • Cài đặt Unix/Linux
  • Các tiện ích cơ bản
  • Các Pipe & Bộ lọc (Filter)

dieu_khien_luong_trong_unix_linux.jsp



Bài viết liên quan

  • 160 bài học ngữ pháp tiếng Anh hay nhất

  • 155 bài học Java tiếng Việt hay nhất

  • 100 bài học Android tiếng Việt hay nhất

  • 247 bài học CSS tiếng Việt hay nhất

  • 197 thẻ HTML cơ bản

  • 297 bài học PHP

  • 101 bài học C++ hay nhất

  • 97 bài tập C++ có giải hay nhất

  • 208 bài học Javascript có giải hay nhất