Linux case command

Lệnh case trong Linux: Hướng dẫn chi tiết từ A đến Z

Trong thế giới của Linux, việc tự động hóa và kiểm soát luồng thực thi của các script là vô cùng quan trọng. Một trong những công cụ mạnh mẽ để đạt được điều này chính là lệnh case. Lệnh case cho phép bạn thực hiện các hành động khác nhau dựa trên giá trị của một biến hoặc biểu thức. Trong bài viết này, chúng ta sẽ khám phá sâu hơn về lệnh case, từ cú pháp cơ bản đến các ví dụ thực tế, giúp bạn làm chủ công cụ này và áp dụng nó vào công việc hàng ngày.

Bài viết này sẽ cung cấp cho bạn một cái nhìn tổng quan toàn diện về lệnh case, bao gồm:

  • Cú pháp cơ bản của lệnh case.
  • Cách sử dụng case với các tùy chọn khác nhau.
  • Ví dụ thực tế về cách case có thể được sử dụng trong các script.
  • So sánh case với các cấu trúc điều khiển khác như if-else.
  • Các câu hỏi thường gặp về lệnh case.

Cú pháp cơ bản của lệnh case

Cú pháp của lệnh case trong Linux khá đơn giản, nhưng cần lưu ý để tránh sai sót. Dưới đây là cú pháp tổng quát:


case expression in
  pattern1)
    commands1
    ;;
  pattern2)
    commands2
    ;;
  pattern3)
    commands3
    ;;
  )
    default_commands
    ;;
esac

Giải thích:

  • case expression in: Bắt đầu khối lệnh case, expression là biến hoặc biểu thức cần kiểm tra.
  • pattern1), pattern2), pattern3): Các mẫu (pattern) được so sánh với expression.
  • commands1, commands2, commands3: Các lệnh được thực thi nếu expression khớp với mẫu tương ứng.
  • ;;: Kết thúc một nhánh case. Bắt buộc phải có.
  • ): Nhánh mặc định. Nếu không có mẫu nào khớp với expression, các lệnh trong nhánh này sẽ được thực thi.
  • esac: Kết thúc khối lệnh case.

Ví dụ minh họa cú pháp cơ bản

Hãy xem xét một ví dụ đơn giản để hiểu rõ hơn về cú pháp. Giả sử chúng ta muốn viết một script để in ra một thông báo khác nhau dựa trên số ngày trong tuần:


#!/bin/bash

day=$(date +%w) # Lấy số ngày trong tuần (0-6, 0 là Chủ nhật)

case "$day" in
  0)
    echo "Hôm nay là Chủ nhật."
    ;;
  1)
    echo "Hôm nay là thứ Hai."
    ;;
  2)
    echo "Hôm nay là thứ Ba."
    ;;
  3)
    echo "Hôm nay là thứ Tư."
    ;;
  4)
    echo "Hôm nay là thứ Năm."
    ;;
  5)
    echo "Hôm nay là thứ Sáu."
    ;;
  6)
    echo "Hôm nay là thứ Bảy."
    ;;
  )
    echo "Ngày không hợp lệ."
    ;;
esac

Trong ví dụ này, biến day chứa số ngày trong tuần, được lấy từ lệnh date. Lệnh case so sánh giá trị của day với các mẫu từ 0 đến 6. Nếu khớp, thông báo tương ứng sẽ được in ra. Nếu không có mẫu nào khớp, thông báo "Ngày không hợp lệ." sẽ được in ra từ nhánh mặc định ).

Sử dụng case với nhiều tùy chọn

Lệnh case không chỉ giới hạn ở việc so sánh với một giá trị đơn lẻ. Bạn có thể sử dụng nhiều tùy chọn (options) hoặc mẫu (patterns) trong mỗi nhánh. Điều này giúp bạn xử lý nhiều trường hợp khác nhau một cách hiệu quả.

Ví dụ, giả sử bạn muốn xử lý các tùy chọn dòng lệnh -h (help) và -v (version) trong một script:


#!/bin/bash

while getopts "hv" opt; do
  case "$opt" in
    h)
      echo "Usage: script.sh [-h] [-v]"
      exit 0
      ;;
    v)
      echo "Version: 1.0"
      exit 0
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

Trong ví dụ này, vòng lặp while getopts được sử dụng để xử lý các tùy chọn dòng lệnh. Lệnh case so sánh giá trị của biến opt với các mẫu h và v. Nếu khớp, các hành động tương ứng sẽ được thực hiện. Nhánh \?) xử lý các tùy chọn không hợp lệ, và nhánh :) xử lý các tùy chọn yêu cầu đối số nhưng không được cung cấp.

Ví dụ thực tế về lệnh case

Để minh họa rõ hơn sức mạnh của lệnh case, chúng ta sẽ xem xét một số ví dụ thực tế:

1. Script kiểm tra loại file


#!/bin/bash

file="$1"

if [ -z "$file" ]; then
  echo "Vui lòng cung cấp tên file."
  exit 1
fi

case "$(file --mime-type -b "$file")" in
  "text/plain")
    echo "Đây là một file văn bản."
    ;;
  "application/pdf")
    echo "Đây là một file PDF."
    ;;
  "image/jpeg")
  "image/png")
    echo "Đây là một file ảnh."
    ;;
  )
    echo "Không thể xác định loại file."
    ;;
esac

Script này nhận một tên file làm đối số và sử dụng lệnh file để xác định loại MIME của file. Sau đó, lệnh case so sánh loại MIME với các mẫu khác nhau để in ra thông báo phù hợp.

2. Menu tương tác


#!/bin/bash

while true; do
  echo "Chọn một tùy chọn:"
  echo "1. Xem danh sách file"
  echo "2. Tạo thư mục mới"
  echo "3. Thoát"
  read -p "Nhập lựa chọn của bạn: " choice

  case "$choice" in
    1)
      ls -l
      ;;
    2)
      read -p "Nhập tên thư mục: " dirname
      mkdir "$dirname"
      ;;
    3)
      echo "Đang thoát..."
      break
      ;;
    )
      echo "Lựa chọn không hợp lệ."
      ;;
  esac
done

Script này tạo ra một menu tương tác cho phép người dùng chọn các tùy chọn khác nhau. Lệnh case được sử dụng để xử lý các lựa chọn của người dùng và thực hiện các hành động tương ứng.

So sánh case và if-else

Cả case và if-else đều là các cấu trúc điều khiển cho phép bạn thực hiện các hành động khác nhau dựa trên điều kiện. Tuy nhiên, có một số khác biệt quan trọng giữa hai cấu trúc này:

if-else:

  • Phù hợp cho các điều kiện phức tạp, logic boolean (true/false).
  • Linh hoạt hơn trong việc kiểm tra các điều kiện khác nhau.
  • Có thể lồng nhau để tạo ra các cấu trúc điều khiển phức tạp.

case:

  • Phù hợp cho việc so sánh một biến hoặc biểu thức với nhiều giá trị.
  • Dễ đọc và dễ bảo trì hơn khi có nhiều nhánh.
  • Thích hợp cho các trường hợp mà bạn muốn xử lý nhiều giá trị khác nhau của cùng một biến.

Dưới đây là bảng so sánh chi tiết:

Tính năng if-else case
Điều kiện Phức tạp, boolean So sánh giá trị
Độ phức tạp Có thể phức tạp Đơn giản hơn
Độ dễ đọc Khó đọc khi lồng nhiều Dễ đọc hơn
Số lượng nhánh Không giới hạn Thích hợp cho nhiều nhánh

Trong nhiều trường hợp, bạn có thể sử dụng cả case và if-else để đạt được cùng một kết quả. Tuy nhiên, việc lựa chọn cấu trúc nào phụ thuộc vào tính chất của bài toán và sở thích cá nhân.

Các câu hỏi thường gặp (FAQ)

Hỏi: Có thể sử dụng regular expression trong các mẫu của lệnh case không?
Đáp: Mặc dù không hỗ trợ regular expression trực tiếp, bạn có thể sử dụng wildcard characters như , ?, và [] để tạo ra các mẫu linh hoạt hơn.
Hỏi: Có giới hạn về số lượng nhánh trong lệnh case không?
Đáp: Không có giới hạn cứng về số lượng nhánh. Tuy nhiên, việc có quá nhiều nhánh có thể làm cho script trở nên khó đọc và khó bảo trì.
Hỏi: Làm thế nào để bỏ qua một nhánh trong lệnh case?
Đáp: Bạn có thể sử dụng lệnh continue để bỏ qua các lệnh trong một nhánh và chuyển sang nhánh tiếp theo. Tuy nhiên, điều này ít khi được sử dụng trong case vì thường thì bạn muốn thực hiện một hành động cụ thể cho mỗi mẫu.

Kết luận

Lệnh case là một công cụ mạnh mẽ và linh hoạt trong Linux, cho phép bạn kiểm soát luồng thực thi của các script dựa trên giá trị của một biến hoặc biểu thức. Bằng cách hiểu rõ cú pháp, cách sử dụng và các ví dụ thực tế, bạn có thể tận dụng tối đa sức mạnh của case để tự động hóa các tác vụ và giải quyết các vấn đề phức tạp một cách hiệu quả. Hãy thử áp dụng lệnh case vào các script của bạn và khám phá những khả năng mà nó mang lại.

Last Updated : 22/08/2025