Trong hướng dẫn này, chúng ta sẽ tìm hiểu về cơ bản của câu lệnh if trong Bash và cách sử dụng nó trong các script shell của bạn.
Quyết định là một trong những khái niệm cơ bản nhất của lập trình máy tính. Giống như bất kỳ ngôn ngữ lập trình nào khác, các câu lệnh if, if..else, if..elif..else và các câu lệnh if lồng nhau trong Bash được sử dụng để thực thi mã dựa trên một điều kiện nhất định.
Câu lệnh if
Câu lệnh điều kiện Bash có thể có các dạng khác nhau. Câu lệnh if cơ bản nhất có dạng như sau:
if ĐIỀU_KIỆN_KIỂM_TRA
then
CÂU_LỆNH
fi
Câu lệnh if bắt đầu với từ khóa if tiếp theo là biểu thức điều kiện và từ khóa then. Câu lệnh kết thúc với từ khóa fi.
Nếu ĐIỀU_KIỆN_KIỂM_TRA được đánh giá là Đúng, CÂU_LỆNH sẽ được thực thi. Nếu ĐIỀU_KIỆN_KIỂM_TRA trả về Sai, không có gì xảy ra; CÂU_LỆNH sẽ bị bỏ qua.
Nhìn vào ví dụ script dưới đây kiểm tra xem một số cụ thể có lớn hơn 10 hay không:
#!/bin/bash
echo -n "Nhập một số: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "Biến lớn hơn 10."
fi
Lưu mã vào một tệp và chạy nó từ dòng lệnh:
bash test.sh
Kịch bản sẽ yêu cầu bạn nhập một số. Nếu, ví dụ, bạn nhập số 15, lệnh kiểm tra sẽ đánh giá là đúng vì 15 lớn hơn 10 và lệnh echo trong phần then sẽ được thực thi.
Biến lớn hơn 10.
Câu lệnh if..else
Câu lệnh if..else Bash có dạng như sau:
if ĐIỀU_KIỆN_KIỂM_TRA
then
CÂU_LỆNH1
else
CÂU_LỆNH2
fi
Nếu ĐIỀU_KIỆN_KIỂM_TRA được đánh giá là Đúng, CÂU_LỆNH1 sẽ được thực thi. Nếu không, nếu ĐIỀU_KIỆN_KIỂM_TRA trả về Sai, CÂU_LỆNH2 sẽ được thực thi. Bạn chỉ có thể có một lệnh else trong câu lệnh.
Hãy thêm một mệnh đề else vào mã script ví dụ trước:
#!/bin/bash
echo -n "Nhập một số: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "Biến lớn hơn 10."
else
echo "Biến bằng hoặc nhỏ hơn 10."
fi
Nếu bạn chạy mã và nhập một số, script sẽ in ra một thông báo khác nhau dựa trên việc số đó lớn hơn hoặc nhỏ/bằng 10.
Câu lệnh if..elif..else
Câu lệnh if..elif..else Bash có dạng như sau:
if ĐIỀU_KIỆN_KIỂM_TRA1
then
CÂU_LỆNH1
elif ĐIỀU_KIỆN_KIỂM_TRA2
then
CÂU_LỆNH2
else
CÂU_LỆNH3
fi
Nếu ĐIỀU_KIỆN_KIỂM_TRA1 được đánh giá là Đúng, CÂU_LỆNH1 sẽ được thực thi. Nếu ĐIỀU_KIỆN_KIỂM_TRA2 được đánh giá là Đúng, CÂU_LỆNH2 sẽ được thực thi. Nếu không có một trong các lệnh kiểm tra nào đánh giá là Đúng, CÂU_LỆNH3 được thực thi.
Bạn có thể có một hoặc nhiều mệnh đề elif trong câu lệnh. Mệnh đề else là tùy chọn.
Các điều kiện được đánh giá tuần tự. Một khi một điều kiện trả về Đúng, các điều kiện còn lại không được thực hiện, và điều khiển chương trình di chuyển đến cuối các câu lệnh if.
Hãy thêm một mệnh đề elif vào mã script trước:
#!/bin/bash
echo -n "Nhập một số: "
read VAR
if [[ $VAR -gt 10 ]]
then
echo "Biến lớn hơn 10."
elif [[ $VAR -eq 10 ]]
then
echo "Biến bằng 10."
else
echo "Biến nhỏ hơn 10."
fi
Câu lệnh if lồng nhau
Bash cho phép bạn lồng các câu lệnh if trong các câu lệnh if khác. Bạn có thể đặt nhiều câu lệnh if trong một câu lệnh if.
Kịch bản sau sẽ yêu cầu bạn nhập ba số và in ra số lớn nhất trong ba số đó.
#!/bin/bash
echo -n "Nhập số đầu tiên: "
read VAR1
echo -n "Nhập số thứ hai: "
read VAR2
echo -n "Nhập số thứ ba: "
read VAR3
if [[ $VAR1 -ge $VAR2 ]]
then
if [[ $VAR1 -ge $VAR3 ]]
then
echo "$VAR1 là số lớn nhất."
else
echo "$VAR3 là số lớn nhất."
fi
else
if [[ $VAR2 -ge $VAR3 ]]
then
echo "$VAR2 là số lớn nhất."
else
echo "$VAR3 là số lớn nhất."
fi
fi
Dưới đây là cách đầu ra sẽ nhìn như thế nào:
Nhập số đầu tiên: 4
Nhập số thứ hai: 7
Nhập số thứ ba: 2
7 là số lớn nhất.
Nói chung, việc sử dụng câu lệnh case thay vì các câu lệnh if lồng nhau là hiệu quả hơn.
Nhiều Điều Kiện
Các toán tử OR và AND logic cho phép bạn sử dụng nhiều điều kiện trong các câu lệnh if.
Dưới đây là một phiên bản khác của script để in ra số lớn nhất trong ba số đó. Trong phiên bản này, thay vì các câu lệnh if lồng nhau, chúng tôi sử dụng toán tử AND (&&).
#!/bin/bash
echo -n "Nhập số đầu tiên: "
read VAR1
echo -n "Nhập số thứ hai: "
read VAR2
echo -n "Nhập số thứ ba: "
read VAR3
if [[ $VAR1 -ge $VAR2 ]] && [[ $VAR1 -ge $VAR3 ]]
then
echo "$VAR1 là số lớn nhất."
elif [[ $VAR2 -ge $VAR1 ]] && [[ $VAR2 -ge $VAR3 ]]
then
echo "$VAR2 là số lớn nhất."
else
echo "$VAR3 là số lớn nhất."
fi
Toán tử kiểm tra
Trong Bash, lệnh kiểm tra (test) có một trong các dạng cú pháp sau:
test BIỂU_THỨC
[ BIỂU_THỨC ]
[[ BIỂU_THỨC ]]
Để làm cho mã có thể chuyển đi, hãy ưu tiên sử dụng lệnh kiểm tra cũ [ (dấu ngoặc vuông đơn), nó có sẵn trên tất cả các shell POSIX. Phiên bản nâng cấp mới của lệnh kiểm tra [[ (dấu ngoặc kép) được hỗ trợ trên hầu hết các hệ thống hiện đại sử dụng Bash, Zsh và Ksh làm shell mặc định.
Để phủ nhận biểu thức kiểm tra, hãy sử dụng toán tử NOT logic (!). Khi so sánh chuỗi, luôn sử dụng dấu ngoặc đơn hoặc kép để tránh vấn đề cắt từ và globbing.
Dưới đây là một số toán tử thường được sử dụng:
- -n VAR – Đúng nếu độ dài của VAR lớn hơn không.
- -z VAR – Đúng nếu VAR là rỗng.
- STRING1 = STRING2 – Đúng nếu STRING1 và STRING2 giống nhau.
- STRING1 != STRING2 – Đúng nếu STRING1 và STRING2 không giống nhau.
- INTEGER1 -eq INTEGER2 – Đúng nếu INTEGER1 và INTEGER2 bằng nhau.
- INTEGER1 -gt INTEGER2 – Đúng nếu INTEGER1 lớn hơn INTEGER2.
- INTEGER1 -lt INTEGER2 – Đúng nếu INTEGER1 nhỏ hơn INTEGER2.
- INTEGER1 -ge INTEGER2 – Đúng nếu INTEGER1 bằng hoặc lớn hơn INTEGER2.
- INTEGER1 -le INTEGER2 – Đúng nếu INTEGER1 bằng hoặc nhỏ hơn INTEGER2.
- -h FILE – Đúng nếu FILE tồn tại và là một liên kết tượng trưng.
- -r FILE – Đúng nếu FILE tồn tại và có thể đọc được.
- -w FILE – Đúng nếu FILE tồn tại và có thể ghi được.
- -x FILE – Đúng nếu FILE tồn tại và có thể thực thi được.
- -d FILE – Đúng nếu FILE tồn tại và là một thư mục.
- -e FILE – Đúng nếu FILE tồn tại và là một tệp, bất kể loại (nút
, thư mục, socket, v.v.).
- -f FILE – Đúng nếu FILE tồn tại và là một tệp thông thường (không phải là thư mục hoặc thiết bị).
Kết luận
Câu lệnh if, if..else và if..elif..else cho phép bạn kiểm soát luồng thực thi của script Bash bằng cách đánh giá các điều kiện đã cho.
Nếu bạn có bất kỳ câu hỏi hoặc phản hồi nào, hãy để lại một comment.