Các mã sau đây cho
[: -ge: nhà điều hành đơn nguyên dự kiến
khi nào
i=0
if [ $i -ge 2 ]
then
#some code
fi
tại sao?
Các mã sau đây cho
[: -ge: nhà điều hành đơn nguyên dự kiến
khi nào
i=0
if [ $i -ge 2 ]
then
#some code
fi
tại sao?
Câu trả lời:
Vấn đề của bạn phát sinh từ thực tế $i
có giá trị trống khi tuyên bố của bạn không thành công. Luôn trích dẫn các biến của bạn khi thực hiện so sánh nếu có khả năng nhỏ nhất là một trong số chúng có thể trống, ví dụ:
if [ "$i" -ge 2 ] ; then
...
fi
Điều này là do cách vỏ xử lý các biến. Giả sử ví dụ ban đầu,
if [ $i -ge 2 ] ; then ...
Điều đầu tiên mà shell thực hiện khi thực thi dòng mã cụ thể đó là thay thế giá trị của $i
, giống như chức năng tìm kiếm & thay thế của trình soạn thảo yêu thích của bạn . Vì vậy, giả sử đó $i
là trống rỗng, hoặc thậm chí minh họa hơn, giả định rằng đó $i
là một loạt các không gian! Vỏ sẽ thay thế $i
như sau:
if [ -ge 2 ] ; then ...
Bây giờ thay thế biến được thực hiện, số tiền thu được vỏ với sự so sánh và .... thất bại bởi vì nó không thể nhìn thấy bất cứ điều gì dễ hiểu cho trái của -gt
. Tuy nhiên, trích dẫn $i
:
if [ "$i" -ge 2 ] ; then ...
trở thành:
if [ " " -ge 2 ] ; then ...
Shell bây giờ nhìn thấy dấu ngoặc kép và biết rằng bạn thực sự đang so sánh bốn khoảng trống với 2 và sẽ bỏ qua if
.
Bạn cũng có tùy chọn chỉ định giá trị mặc định $i
nếu $i
trống, như sau:
if [ "${i:-0}" -ge 2 ] ; then ...
Điều này sẽ thay thế các giá trị 0 thay vì $i
được $i
là undefined. Tôi vẫn duy trì dấu ngoặc kép bởi vì, một lần nữa, nếu $i
là một loạt các khoảng trống thì nó không được tính là không xác định , nó sẽ không được thay thế bằng 0 và bạn sẽ lại gặp vấn đề.
Xin vui lòng đọc này khi bạn có thời gian. Vỏ được nhiều người coi là hộp đen, nhưng nó hoạt động với rất ít và rất đơn giản - một khi bạn nhận thức được các quy tắc đó là gì (một trong số đó là cách các biến hoạt động trong vỏ, như đã giải thích ở trên), vỏ sẽ không còn bí mật nào cho bạn
Tôi cần thêm 5 xu của tôi. Tôi thấy mọi người sử dụng [
hoặc [[
, nhưng đáng để đề cập rằng họ không phải là một phần của cú pháp if.
Để so sánh số học, sử dụng ((...))
thay thế.
((...)) là một lệnh số học, trả về trạng thái thoát là 0 nếu biểu thức là khác 0 hoặc 1 nếu biểu thức bằng không. Cũng được sử dụng như một từ đồng nghĩa cho "cho phép", nếu cần có tác dụng phụ (bài tập).
Đoạn kịch bản của bạn hoạt động rất tuyệt Bạn có chắc chắn rằng bạn không gán bất cứ điều gì khác trước khi "i" không?
Một lỗi phổ biến cũng là không để lại một khoảng trắng sau và trước dấu ngoặc vuông.