Nó phụ thuộc vào Test Construct xung quanh các nhà điều hành. lựa chọn của bạn là dấu ngoặc kép, dấu ngoặc kép, dấu ngoặc đơn, hoặc test
Nếu bạn sử dụng ((...)), bạn đang thử nghiệm công bằng số học với ==
như trong C:
$ ((1==1)); echo $?
0
$ ((1==2)); echo $?
1
(Lưu ý: 0
nghĩa true
trong Unix ý nghĩa và không phải là một thử nghiệm không thành công)
Sử dụng -eq
bên trong dấu ngoặc kép là lỗi cú pháp.
Nếu bạn đang sử dụng [...] (hoặc dây đeo duy nhất) hoặc [[...]] (hoặc dây đeo kép), hoặc test
bạn có thể sử dụng một trong -eq, -ne, -lt, -le, -gt, hoặc -ge như một arithmetic comparison .
$ [ 1 -eq 1 ]; echo $?
0
$ [ 1 -eq 2 ]; echo $?
1
$ test 1 -eq 1; echo $?
0
Các ==
bên trong đơn hoặc kép niềng răng (hoặc test
lệnh) là một trong những string comparison operators:
$ [[ "abc" == "abc" ]]; echo $?
0
$ [[ "abc" == "ABC" ]]; echo $?
1
Như một nhà điều hành chuỗi, =
tương đương với ==
và lưu ý các khoảng trắng xung quanh =
hoặc ==
yêu cầu của nó.
Trong khi bạn có thể làm [[ 1 == 1 ]]
hoặc [[ $((1+1)) == 2 ]]
nó đang thử nghiệm bình đẳng chuỗi - không phải là bình đẳng số học.
Vì vậy -eq
sản xuất kết quả lẽ Dự kiến giá trị số nguyên của 1+1
bằng 2
mặc dù RH là một chuỗi và có một không gian dấu:
$ [[ $((1+1)) -eq "2 " ]]; echo $?
0
Trong khi một chuỗi so sánh của cùng một chọn không gian theo sau và do đó so sánh chuỗi không thành công:
$ [[ $((1+1)) == "2 " ]]; echo $?
1
Và so sánh chuỗi sai lầm có thể tạo ra hoàn thành e sai câu trả lời. '10' là theo từ điển nhỏ hơn '2', do đó, so sánh chuỗi trả về true
hoặc 0
. Vì vậy, nhiều người đang bị cắn bởi lỗi này:
$ [[ 10 < 2 ]]; echo $?
0
vs các thử nghiệm chính xác cho 10 là số học ít hơn 2:
$ [[ 10 -lt 2 ]]; echo $?
1
Trong ý kiến, có một câu hỏi của kỹ thuật lý do sử dụng số nguyên -eq
trên chuỗi trả về Đúng cho các chuỗi không giống nhau:
$ [[ "yes" -eq "no" ]]; echo $?
0
Lý do là Bash là untyped. Các -eq
làm cho chuỗi để được hiểu là số nguyên nếu có thể bao gồm chuyển đổi cơ sở:
$ [[ "0x10" -eq 16 ]]; echo $?
0
$ [[ "010" -eq 8 ]]; echo $?
0
$ [[ "100" -eq 100 ]]; echo $?
0
Và 0
nếu Bash nghĩ nó chỉ là một chuỗi:
$ [[ "yes" -eq 0 ]]; echo $?
0
$ [[ "yes" -eq 1 ]]; echo $?
1
Vì vậy [[ "yes" -eq "no" ]]
tương đương với [[ 0 -eq 0 ]]
Lưu ý cuối cùng: Nhiều phần mở rộng cụ thể của Bash đối với Cấu trúc thử nghiệm không phải là POSIX và do đó sẽ không thành công trong các trình bao khác. Các trình bao khác thường không hỗ trợ [[...]]
và ((...))
hoặc ==
.
Sử dụng '== 'ở đây là hình thức xấu, như chỉ' =' được xác định bởi POSIX . –
Nếu bạn thực sự nhấn mạnh để sử dụng '==' thì đặt nó vào giữa '[[' và ']]'. (Và đảm bảo rằng dòng đầu tiên của tập lệnh chỉ định sử dụng '/ bin/bash'.) – holgero