Trong bash
mỗi biến về cơ bản là một chuỗi (hoặc một mảng hoặc một hàm, nhưng hãy nói về các biến thông thường ở đây).
Các điều kiện được phân tích cú pháp dựa trên các giá trị trả về của các lệnh kiểm tra - giá trị trả về không phải là một biến, đó là trạng thái thoát. Khi bạn đánh giá if [ ... ]
hoặc if [[ ]]
hoặc if grep something
bất cứ thứ gì tương tự, giá trị trả về 0 (không phải chuỗi 0, nhưng trạng thái thoát 0 = thành công) có nghĩa là đúng và phần còn lại có nghĩa là sai (vì vậy, hoàn toàn ngược lại với ngôn ngữ lập trình được biên dịch, nhưng vì có một cách để thành công và nhiều cách để thất bại, và kết quả thực hiện dự kiến thường là thành công, 0 được sử dụng làm kết quả mặc định phổ biến nhất nếu không có gì sai). Điều này rất hữu ích vì bất kỳ nhị phân nào cũng có thể được sử dụng làm thử nghiệm - nếu thất bại, đó là sai, nếu không thì đúng.
true
và false
các chương trình (thường bị ghi đè bởi nội dung) chỉ là những chương trình nhỏ không có tác dụng gì - true
thành công khi không làm gì và thoát ra 0, trong khi false
cố gắng không làm gì và "thất bại", thoát ra 1. Nghe có vẻ vô nghĩa nhưng rất tiện cho việc viết kịch bản.
Đối với cách vượt qua sự thật lòng, điều đó tùy thuộc vào bạn. Điều khá phổ biến là chỉ sử dụng "y" hoặc "có" cho sự thật và sử dụng if [ x"$variable" = x"yes" ]
(nối thêm chuỗi giả x
vì nếu $variable
tình cờ có độ dài bằng không, điều này bảo vệ khỏi việc tạo một lệnh không có thật if [ = "yes" ]
mà không phân tích cú pháp). Cũng có thể hữu ích khi chỉ cần sử dụng một chuỗi rỗng cho sai và sử dụng [ -z "$variable ]
để kiểm tra xem nó có độ dài bằng không (hoặc -n
cho nó là khác không).
Dù sao, thực sự rất hiếm khi cần phải vượt qua các giá trị boolean bash
- đơn giản hơn là chỉ đơn giản là exit
thất bại, hoặc trả về một kết quả hữu ích (hoặc bằng 0 nếu có sự cố và kiểm tra chuỗi rỗng), và hầu hết các trường hợp đều có thể kiểm tra thất bại trực tiếp từ statatus thoát.
Trong trường hợp của bạn, bạn muốn một hàm sẽ hoạt động như bất kỳ lệnh nào khác (do đó, trả về 0 khi thành công), vì vậy tùy chọn cuối cùng của bạn có vẻ là lựa chọn đúng.
Ngoài ra, bạn thậm chí có thể không cần return
tuyên bố. Nếu hàm đủ đơn giản, bạn có thể sử dụng thực tế là nó chỉ trả về trạng thái của lệnh được thực hiện cuối cùng trong hàm. Vì vậy, chức năng của bạn có thể chỉ đơn giản là
drive_xyz_available() {
[ -e /dev/disk/by-uuid/whatever ]
}
nếu bạn đang kiểm tra sự tồn tại của một nút thiết bị (hoặc grep /proc/mounts
để kiểm tra xem nó có được gắn không?).
help true ; help false ; help exit