Trong lịch sử, test
lệnh tồn tại đầu tiên (ít nhất là từ phiên bản thứ bảy Unix năm 1979). Nó sử dụng các nhà khai thác =
và !=
để so sánh chuỗi, và -eq
, -ne
, -lt
, vv để so sánh những con số. Ví dụ, test 0 = 00
là sai, nhưng test 0 -eq 00
là đúng. Tôi không biết tại sao cú pháp này được chọn, nhưng nó có thể tránh sử dụng <
và >
, cái vỏ sẽ được phân tích cú pháp như các toán tử chuyển hướng. Các test
lệnh có cú pháp khác một vài năm sau đó: [ … ]
tương đương với test …
.
Các [[ … ]]
cú pháp có điều kiện, bên trong đó <
và >
có thể được sử dụng như các nhà khai thác mà không cần trích dẫn, đã được bổ sung sau, trong ksh. Nó giữ khả năng tương thích ngược với [ … ]
, vì vậy nó đã sử dụng cùng các toán tử, nhưng được thêm vào <
và >
để so sánh các chuỗi (ví dụ, [[ 9 > 10 ]]
nhưng [[ 9 -lt 10 ]]
). Để biết thêm thông tin, hãy xem sử dụng dấu ngoặc đơn hoặc dấu ngoặc kép - bash
Các biểu thức số học cũng đến muộn hơn so với test
lệnh, trong vỏ Korn , tại một số thời điểm trong những năm 1980. Họ theo cú pháp của ngôn ngữ C, rất phổ biến trong các vòng tròn Unix. Do đó, họ đã sử dụng các toán tử C: ==
cho đẳng thức, <=
cho ít hoặc bằng, v.v.
Phiên bản thứ bảy của Unix không có biểu thức số học, nhưng nó có expr
lệnh , cũng đã thực hiện cú pháp giống như C cho các hoạt động số nguyên, bao gồm các toán tử so sánh của nó. Trong một kịch bản shell, các ký tự <
và >
phải được trích dẫn để bảo vệ chúng khỏi shell, ví dụ như if expr 1 \< 2; …
tương đương với if test 1 -lt 2; …
. Việc bổ sung các biểu thức số học vào hệ vỏ khiến hầu hết các cách sử dụng expr
bị lỗi thời, vì vậy ngày nay nó không được biết đến nhiều.
Trong tập lệnh sh, bạn thường sử dụng các biểu thức số học để tính giá trị nguyên và [ … ]
để so sánh các số nguyên.
if [ "$((x + y))" -lt "$z" ]; then …
Trong tập lệnh ksh, bash hoặc zsh, bạn có thể sử dụng ((…))
cho cả hai.
if ((x + y < z)); then …
Biểu [[ … ]]
mẫu rất hữu ích nếu bạn muốn sử dụng các điều kiện liên quan đến những thứ khác ngoài số nguyên.
= != < <= > >=
so sánh chuỗi .1 -eq 01
nhưng1 != 01
và8 -lt 42
nhưng8 > 42