Một mồi Boolean nhanh cho Bash
Các if
tuyên bố mất một lệnh như một tham số (như làm &&
, ||
vv). Mã kết quả số nguyên của lệnh được hiểu là boolean (0 / null = true, 1 / other = false).
Câu test
lệnh lấy toán tử và toán hạng làm đối số và trả về mã kết quả có cùng định dạng với if
. Một bí danh của test
tuyên bố là [
, thường được sử dụng if
để thực hiện các so sánh phức tạp hơn.
Các câu lệnh true
và false
không làm gì cả và trả về mã kết quả (lần lượt là 0 và 1). Vì vậy, chúng có thể được sử dụng như những chữ boolean trong Bash. Nhưng nếu bạn đặt các câu lệnh ở một nơi mà chúng được hiểu là các chuỗi, bạn sẽ gặp vấn đề. Trong trường hợp của bạn:
if [ foo ]; then ... # "if the string 'foo' is non-empty, return true"
if foo; then ... # "if the command foo succeeds, return true"
Vì thế:
if [ true ] ; then echo "This text will always appear." ; fi;
if [ false ] ; then echo "This text will always appear." ; fi;
if true ; then echo "This text will always appear." ; fi;
if false ; then echo "This text will never appear." ; fi;
Điều này tương tự như làm một cái gì đó như echo '$foo'
vs.echo "$foo"
.
Khi sử dụng test
câu lệnh, kết quả phụ thuộc vào các toán tử được sử dụng.
if [ "$foo" = "$bar" ] # true if the string values of $foo and $bar are equal
if [ "$foo" -eq "$bar" ] # true if the integer values of $foo and $bar are equal
if [ -f "$foo" ] # true if $foo is a file that exists (by path)
if [ "$foo" ] # true if $foo evaluates to a non-empty string
if foo # true if foo, as a command/subroutine,
# evaluates to true/success (returns 0 or null)
Nói tóm lại , nếu bạn chỉ muốn kiểm tra một cái gì đó là pass / fail (còn gọi là "true" / "false"), thì hãy truyền một lệnh cho câu lệnh if
hoặc &&
vv của bạn , không có dấu ngoặc. Để so sánh phức tạp, sử dụng dấu ngoặc với các toán tử thích hợp.
Và vâng, tôi biết không có những điều như một kiểu boolean mẹ đẻ trong Bash, và điều đó if
và [
và true
về mặt kỹ thuật "lệnh" chứ không phải "báo cáo"; đây chỉ là một lời giải thích rất cơ bản, chức năng.