Xin chào! Chúng ta đã tìm hiểu những kiến thức cơ bản về shell scripting như chấp nhận dữ liệu đầu vào, xử lý dữ liệu thông qua các phép toán số học và tạo và hiển thị đầu ra trong các phần trước của hướng dẫn này (phần 1 và phần 2). Trong phần này, chúng ta sẽ đi sâu hơn vào một chủ đề nâng cao hơn trong ngôn ngữ lập trình -- đưa ra quyết định trong một chương trình, nhưng lần này chúng ta sẽ thực hiện bằng cách sử dụng bash shell. Hãy bắt đầu thôi!
Quyết định kép:
Nhiều điều kiện if:
Cú pháp ngoặc đơn là cú pháp được hỗ trợ lâu đời nhất trong bash shell. Nó được sử dụng cùng với tất cả các câu lệnh điều kiện trong Linux. Trong khi đó, cú pháp ngoặc kép được sử dụng cho câu lệnh điều kiện dựa trên số để cung cấp cú pháp quen thuộc cho các lập trình viên. Tất cả các loại câu lệnh if đều cần một điều kiện được chỉ định để thực hiện một tác vụ.
Trong ví dụ này, chúng tôi đảm bảo rằng shell sẽ trở về thư mục home bất kể thư mục đang hoạt động hiện tại của chúng tôi là gì bằng lệnh cd. Ngoài ra, lệnh ls được sử dụng để hiển thị danh sách các tệp trong thư mục để chúng tôi xác minh tệp có thực sự tồn tại hay không. Như bạn có thể thấy, tập lệnh xuất ra văn bản "tệp tồn tại!" vì sample.sh nằm trong thư mục home.
Bây giờ chúng ta hãy cải thiện tập lệnh của mình bằng cách làm cho mã của chúng ta năng động hơn bằng cách cho phép người dùng nhập tên tập lệnh và xác định quyền của tệp đã cho.
Chúng ta hãy tạo một tập lệnh mẫu bằng cách sử dụng câu lệnh điều kiện dựa trên chuỗi. Tập lệnh sẽ cho phép người dùng nhập hai chuỗi và đánh giá xem một trong hai chuỗi có giá trị null hay không, cả hai chuỗi đều bằng nhau và không bằng nhau.
Dưới đây là danh sách các thuật ngữ ghi nhớ có sẵn cho các câu lệnh điều kiện dựa trên số học trong shell:
Hãy tạo một tập lệnh chấp nhận một số nguyên từ người dùng và xác định xem số nguyên đó là số không, số âm, số lẻ hay số chẵn.
Toán tử số học cho dấu ngoặc kép cú pháp:
Bây giờ, hãy xây dựng lại tập lệnh trước đó của chúng ta và sử dụng cú pháp dấu ngoặc kép:
Mẫu là giá trị có thể có của biến. Mỗi mẫu được phân tách bằng dấu chấm phẩy kép đóng vai trò là câu lệnh break của mẫu. Câu lệnh switch được đóng bằng câu lệnh esac.
Giới thiệu
Hầu hết các ngôn ngữ lập trình ngày nay đều có thể đưa ra quyết định dựa trên các điều kiện chúng ta đặt ra. Điều kiện là một biểu thức đánh giá thành giá trị Boolean - đúng hoặc sai. Bất kỳ lập trình viên nào cũng có thể làm cho chương trình của mình trở nên thông minh dựa trên quyết định và logic mà họ đưa vào chương trình. Bash shell hỗ trợ các câu lệnh quyết định if và switch (case).Câu lệnh If
If là một câu lệnh cho phép lập trình viên đưa ra quyết định trong chương trình dựa trên các điều kiện mà anh ta chỉ định. Nếu điều kiện được đáp ứng, chương trình sẽ thực thi một số dòng mã nhất định, nếu không, chương trình sẽ thực thi các tác vụ khác mà lập trình viên chỉ định. Sau đây là cú pháp được hỗ trợ của câu lệnh if trong shell bash.Cú pháp chung
Quyết định đơn:
Mã:
if
then
### chuỗi mã sẽ được đưa vào đây
fi
Mã:
if
then
### chuỗi mã nếu điều kiện được thỏa mãn
else
### chuỗi mã nếu điều kiện không được thỏa mãn
fi
Mã:
if
then
### chuỗi mã cho điều kiện1
elif
then
### chuỗi mã cho điều kiện2
else
### chuỗi mã nếu điều kiện không được thỏa mãn
fi
Cú pháp ngoặc đơn
Mã:
nếu [ điều kiện ]
thì
### chuỗi mã sẽ ở đây
fi
Cú pháp ngoặc kép
Mã:
nếu ((điều kiện))
thì
### chuỗi mã sẽ ở đây
fi
Câu lệnh có điều kiện trong Linux
Câu lệnh có điều kiện được sử dụng cùng với câu lệnh điều khiển quyết định. Có nhiều loại câu lệnh có điều kiện khác nhau mà bạn có thể sử dụng trong bash shell, những loại phổ biến nhất là: điều kiện dựa trên tệp, dựa trên chuỗi và dựa trên số học.Điều kiện dựa trên tệp
Điều kiện dựa trên tệp là các biểu thức đơn và thường được sử dụng để kiểm tra trạng thái của tệp. Danh sách sau đây hiển thị các điều kiện dựa trên tệp được sử dụng phổ biến nhất trong shell bash.Toán tử | Mô tả |
-a file | Trả về true nếu tệp tồn tại |
-b file | Trả về true nếu tệp tồn tại và là tệp khối đặc biệt |
-c file | Trả về true nếu tệp tồn tại và là tệp ký tự đặc biệt |
-d file | Trả về true nếu tệp tồn tại và là thư mục |
-e file | Trả về true nếu tệp tồn tại |
-r file | Trả về true nếu tệp tồn tại và có thể đọc được |
-s file | Trả về true nếu tệp tồn tại và có kích thước lớn hơn 0 |
-s file | Trả về true nếu tệp tồn tại và có kích thước lớn hơn 0 |
-w file | Trả về true nếu tệp tồn tại và có thể ghi |
-x file | Trả về true nếu tệp tồn tại và có thể thực thi |
-N file | Trả về true nếu tệp tồn tại và đã được sửa đổi kể từ lần đọc cuối cùng |
Ra quyết định dựa trên tệp
Chúng ta hãy xem một ví dụ minh họa cách xây dựng quyết định dựa trên tệp trong tập lệnh bash. Trong ví dụ này, chúng ta sẽ tạo một tập lệnh xác định xem tệp có tồn tại trong thư mục gốc hay không.
Mã:
#!/bin/bash
cd
ls
if [ -e sample.sh ]
then
echo "tệp tồn tại!"
else
echo "tệp không tồn tại"
fi
Trong ví dụ này, chúng tôi đảm bảo rằng shell sẽ trở về thư mục home bất kể thư mục đang hoạt động hiện tại của chúng tôi là gì bằng lệnh cd. Ngoài ra, lệnh ls được sử dụng để hiển thị danh sách các tệp trong thư mục để chúng tôi xác minh tệp có thực sự tồn tại hay không. Như bạn có thể thấy, tập lệnh xuất ra văn bản "tệp tồn tại!" vì sample.sh nằm trong thư mục home.
Mã:
Lưu ý: Trình biên dịch shell rất nghiêm ngặt về mặt cú pháp, đặc biệt là với khoảng trắng. Nên có một khoảng cách giữa if và dấu ngoặc mở và giữa các dấu ngoặc và điều kiện.
Mã:
#!/bin/bash
cd
ls -l
read -p "Nhập tên tệp: " filename
if [ -e $filename ]
then
echo "tệp tồn tại!"
if [ -r $filename ]
then
status="readable "
fi
if [ -w $filename ]
then
status=$status"writable "
fi
if [ -x $filename ]
then
status=$status"executable"
fi
echo "file permission: "$status
else
echo "file does not exist"
fi
Điều kiện dựa trên chuỗi
Việc đưa ra quyết định dựa trên chuỗi đầu vào của người dùng cũng khả thi trong bash shell. Điều kiện dựa trên chuỗi trả về một biểu thức nhị phân làm kết quả, nghĩa là nó trả về true nếu điều kiện đã chỉ định được thỏa mãn, nếu không, nó trả về false. Sau đây là các toán tử điều kiện dựa trên chuỗi thường được sử dụng:Toán tử | Mô tả |
== | Trả về true nếu các chuỗi bằng nhau |
!= | Trả về true nếu các chuỗi không bằng nhau |
-n | Trả về true nếu chuỗi cần kiểm tra không phải là null |
-z | Trả về true nếu chuỗi cần kiểm tra là null |
Mã:
#!/bin/bash
read -p "Chuỗi đầu tiên: " str1
read -p "Chuỗi thứ hai: " str2
if [ -z "$str1" ]
then
echo "Chuỗi thứ nhất là null"
elif [ -z "$str2" ]
then
echo "Chuỗi thứ 2 là null"
else
if [ $str1 == $str2 ]
then
echo "Các chuỗi bằng nhau"
else
echo "Các chuỗi không bằng nhau"
fi
fi
Điều kiện dựa trên số học
Shell cung cấp một số cách để khai báo điều kiện dựa trên số học. Đầu tiên là sử dụng các thuật ngữ ghi nhớ có thể được sử dụng cùng với cú pháp ngoặc đơn kiểu cũ và cách còn lại là sử dụng các ký hiệu thân thiện với toán học có thể được sử dụng cùng với dấu ngoặc đơn képDưới đây là danh sách các thuật ngữ ghi nhớ có sẵn cho các câu lệnh điều kiện dựa trên số học trong shell:
Toán tử | Cách sử dụng/Mô tả |
-eq | Bằng |
-ge | Lớn hơn hoặc bằng |
-gt | Lớn hơn |
-le | Nhỏ hơn hoặc bằng |
-lt | Nhỏ hơn |
-ne | Không Bằng |
Mã:
#!/bin/bash
read -p "Nhập một số nguyên: " int1
if [ $int1 -eq 0 ]
then
echo "Số không"
elif [ $int1 -lt 0 ]
then
echo "Số âm"
else
if [ $((int1%2)) -eq 0 ]
then
echo "Số chẵn"
else
echo "Lẻ"
fi
fi
Toán tử số học cho dấu ngoặc kép cú pháp:
Toán tử | Cách sử dụng/Mô tả |
== | Bằng |
>= | Lớn hơn hoặc bằng |
> | Lớn hơn |
<= | Nhỏ hơn hoặc bằng |
< | Nhỏ hơn |
!= | Không bằng |
Mã:
#!/bin/bash
read -p "Nhập một số nguyên: " int1
if (( $int1 == 0 ))
then
echo "Zero"
elif (( $int1 < 0 ))
then
echo "Negative"
else
if (( $((int1%2)) == 0 ))
then
echo "Even"
else
echo "Odd"
fi
fi
Câu lệnh Switch
Câu lệnh switch là một loại câu lệnh điều kiện khác trong shell scripting. Nó cho phép lập trình viên so sánh nhiều giá trị với một biến theo cách dễ dàng hơn so với câu lệnh điều kiện if. Cú pháp của câu lệnh switch là:
Mã:
case in
)
##chuỗi mã cho pattern1
;;
)
##chuỗi mã cho pattern2
;;
)
##chuỗi mã cho patternN
;;
*)
##câu lệnh default
esac
Mã:
#!/bin/bash
clear
read -p "Integer1: " int1
read -p "Integer2: " int2
echo "======================="
printf "Menu: \n[a] Phép cộng\n[b]Phép trừ\n[c]Phép nhân\n[d]Phép chia\n"
echo "========================="
read -p "Lựa chọn của bạn: " lựa chọn
res=0
trường hợp $choice trong
a)
res=$((int1+int2))
;;
b)
res=$((int1-int2))
;;
c)
res=$((int1*int2))
;;
d)
res=$((int1/int2))
;;
*)
echo "Đầu vào không hợp lệ"
esac
echo "Kết quả là: " $res