So sánh số nguyên trong bash, toán tử đơn nguyên dự kiến


137

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:


295

Vấn đề của bạn phát sinh từ thực tế $icó 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ử đó $ilà trống rỗng, hoặc thậm chí minh họa hơn, giả định rằng đó $ilà một loạt các không gian! Vỏ sẽ thay thế $inhư 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 $inếu $itrố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 $ilà undefined. Tôi vẫn duy trì dấu ngoặc kép bởi vì, một lần nữa, nếu $ilà 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


7
biến trích dẫn sẽ phát sinh một lỗi mới như biểu thức số nguyên dự kiến
Néstor

@ Néstor sai , trích dẫn một biến sẽ KHÔNG gây ra lỗi mới như biểu thức số nguyên dự kiến nếu biến là số; cung cấp một giá trị biến không phải là số, cho dù được trích dẫn hay không, sẽ dẫn đến lỗi đã nói.
vladr

6

Đánh giá từ thông báo lỗi, giá trị của i là chuỗi rỗng khi bạn thực thi nó, không phải 0.


6

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).

Xem: ArithaturesExpression


2

Đ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.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.