Các toán hạng của so sánh số -eq
, -gt
, -lt
, -ge
, -le
và -ne
được thực hiện như là biểu thức số học. Với một số hạn chế, chúng vẫn cần phải là các từ đơn.
Hành vi của các tên biến trong biểu thức số học được mô tả trong Shell Số học :
Biến Shell được phép dưới dạng toán hạng; mở rộng tham số được thực hiện trước khi biểu thức được ước tính. Trong một biểu thức, các biến shell cũng có thể được tham chiếu theo tên mà không cần sử dụng cú pháp mở rộng tham số. Một biến shell là null hoặc unset ước tính thành 0 khi được tham chiếu theo tên mà không sử dụng cú pháp mở rộng tham số.
và cũng:
Giá trị của một biến được đánh giá là biểu thức số học khi nó được tham chiếu
Nhưng tôi thực sự không thể tìm thấy một phần của tài liệu mà người ta nói rằng các phép so sánh số có các biểu thức số học. Nó không được mô tả trong Cấu trúc có điều kiện bên dưới [[
, cũng không được mô tả trong Biểu thức điều kiện Bash .
Nhưng, bằng thí nghiệm, nó dường như hoạt động như đã nói ở trên.
Vì vậy, những thứ như thế này hoạt động:
a=6
[[ a -eq 6 ]] && echo y
[[ 1+2+3 -eq 6 ]] && echo y
[[ "1 + 2 + 3" -eq 6 ]] && echo y
điều này cũng vậy (giá trị của biến được ước tính):
b='1 + 2 + 3'
[[ b -eq 6 ]] && echo y
Nhưng điều này không; nó không phải là một từ vỏ khi[[ .. ]]
được phân tích cú pháp, do đó có lỗi cú pháp trong điều kiện:
[[ 1 + 2 + 3 -eq 6 ]] && echo y
Trong các bối cảnh số học khác, không cần biểu thức không có khoảng trắng. Bản in này999
, khi các dấu ngoặc rõ ràng phân định biểu thức số học trong chỉ mục:
a[6]=999; echo ${a[1 + 2 + 3]}
Mặt khác, =
so sánh là một kết quả khớp mẫu và không liên quan đến số học, cũng không phải việc mở rộng biến tự động được thực hiện trong ngữ cảnh số học (Cấu trúc có điều kiện):
Khi các toán tử ==
và !=
toán tử được sử dụng, chuỗi bên phải của toán tử được coi là một mẫu và được khớp theo các quy tắc được mô tả bên dưới trong Kết hợp mẫu, như thể tùy chọn vỏ ngoài được bật. Các=
nhà điều hành giống hệt ==
.
Vì vậy, điều này là sai vì các chuỗi rõ ràng là khác nhau:
[[ "1 + 2 + 3" = 6 ]]
như thế này, mặc dù các giá trị số là như nhau:
[[ 6 = 06 ]]
và ở đây cũng vậy, các chuỗi ( x
và 6
) được so sánh, chúng khác nhau:
x=6
[[ x = 6 ]]
Điều này sẽ mở rộng biến, tuy nhiên, vì vậy điều này là đúng:
x=6
[[ $x = 6 ]]
x=1
theo[[ x -gt 2]]
?