Saturday, January 15, 2011

[Shell script] Các câu lệnh điều kiện, rẽ nhánh-Condition

Các câu lệnh được sử dụng cho việc rẽ nhánh, điều kiện như if-then, test, hoặc cặp dấu [ expr ]. Phần này sẽ tìm hiểu cách shell làm việc với những thứ như vậy.

1.If-then  

Câu lệnh if-then đc sử dụng để tạo nên việc đánh giá điều điện nào đó. Cú pháp:

if condition
then
    commands
    ...
fi

Ý nghĩa: với if-then trên, trước tiên sẽ đánh giá condition, nếu condition thực thi thành công(exit status code=0) thì sẽ thực hiện các commands sau then.

Ví dụ:
Ta có đoạn script:
Thực thi:



Ở trên, biến testuser đc gán là Cuong.bắt đầu mệnh đề if, câu lệnh grep sẽ tìm xem trong file /etc/passwd có chuỗi nào có tên là Cuong hay ko, nếu trùng tức là câu lệnh đc thực hiện thành công, exit status code là 0. Lúc này, các câu lệnh theo sau then sẽ đc thực thi, liệt kê toàn bộ những file bash của testuser
Ngoài ra còn có thể đặt theo kiểu
if command; then
commands
fi

2.if-then-else

Với mệnh đề if-then ở trên, ta chỉ có 1 lựa chọn cho việc đánh giá. Mệnh đề if-then-else cung cấp một cách so sánh khác. Cho phép ta có nhiều lựa chọn hơn cho việc so sánh.

Cú pháp:
if command
then
    commands
else
    commands
fi

Nếu command trong câu lệnh if đầu tiên, trả về một exit status code là 0(zero), thì những commands ngay sau then sẽ đc thực thi tương tự như if-then. Nhưng nếu command trên if ko trả về 0, thì các commands phía sau else sẽ đc thực thi.

Thực thi:


3.Câu lệnh test hoặc cặp dấu [ expr ]

Cả 2 Câu lệnh thường đc sử dụng để kiểm tra định dạng file hoặc so sánh các giá trị. Thường thì đc sử dụng cho việc:
  1. -So sánh các thuộc tính của file
  2. -Thực hiện việc so sánh các chuỗi
  3. -So sánh toán học

Cú pháp:
test condition

condition là một loạt các tham số và giá trị đc test thực hiện. Nếu sử dụng với if-then thì sẽ tương tự như vầy:

if test condition
then
commands
fi

hoặc
if [ condition ]
then
commands
fi

***Lưu ý khoảng trắng của condition

So sánh số:




















So sánh string:



So sánh thuộc tính của file:




Một số phép so sánh trong shell:


-eq  ngang bằng
-ne không ngang bằng
-lt nhỏ hơn
-lenhỏ hơn hoặc bằng
-gt lớn hơn
-ge lớn hơn hoặc bằng

Một số phép xử lý thuộc tính file:

-s file tồn tại và khác rỗng(NULL)
-f file tồn tại và ko phải là thư mục
-d thư mục tồn tại
-x file có thể thực thi
-w file có thể ghi
-r file có thể đọc

Làm việc với string:

OperatorMeaning
string1 = string2 string1 ngang bằng string2
string1 != string2string1 khác  string2
string1string1 ko rỗng hoặc ko đc định nghĩa
-n string1string1 tồn tại và không rỗng
-z string1string1 tồn tại nhưng rỗng

Phép toán logic:



Operator           Meaning
! expressionphép NOT
expression1  -a  expression2phép  AND
expression1  -o  expression2phép  OR

7 comments:

  1. Hi Cường,
    Trường hợp mình muốn so sánh 1 biến với 1 số thực thì dùng command gì?

    ReplyDelete
  2. Để xử lý với số real hoặc float, dùng bc trong linux

    [Cuong@Fedora ~]$ echo 1.2+5.3 | bc
    6.5

    ReplyDelete
  3. Hi Cường,
    Mình dùng các lênh so sánh -eq, -ne, -gt .. khi biên dịch báo lỗi command not found. Để dùng được mấy lệnh này có cần import thêm gì nữa không?

    Thanks

    ReplyDelete
  4. -eq, -ne, -gt.. ko phải là các câu lệnh mà chỉ là các biểu thức so sánh trong bash shell thôi, ko cần import gì cả. Nếu báo lỗi command not found, bạn thử kiểm tra lại các câu lệnh đang sử dụng trong script.

    ReplyDelete
  5. Thanks Cường!

    Do lúc mình đã dùng được các biểu thức so sánh trên. Do mới tìm hiểu cấu trúc Shell script nên chưa nắm rõ cú pháp. Lỗi command not found là do mình bị lỗi khoảng trắng khi dùng dấu [].
    Thanks again

    ReplyDelete
  6. cho hoi lenh dung man hinh trong shell la gi vay.
    minh nhap trong vong lap while ma no cu chay miet ak.
    Thanks

    ReplyDelete
  7. sao ma em dùng câu lệnh if khi chạy thì nó chỉ hiện kết quả ở câu lệnh cuối mà k thực hiện điều kiện .Ai biết chỉ em với yahoo: haoduc44

    ReplyDelete