Bên cạnh các đối số mỹ phẩm / sở thích, một lý do có thể là có nhiều triển khai trong đó [ ! "$a" = "$b" ]
thất bại trong các trường hợp góc hơn so với [ "$a" != "$b" ]
.
Cả hai trường hợp nên an toàn nếu việc triển khai tuân theo thuật toán POSIX , nhưng ngay cả ngày hôm nay (đầu năm 2018 khi viết), vẫn có những triển khai thất bại. Chẳng hạn, với a='(' b=')'
:
$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1
Với dash
các phiên bản trước 0.5.9, như phiên bản 0.5.8 được tìm thấy như sh
trên Ubuntu 16.04 chẳng hạn:
$ a='(' b=')' dash -c '[ "$a" != "$b" ]; echo "$?"'
0
$ a='(' b=')' dash -c '[ ! "$a" = "$b" ]; echo "$?"'
1
(đã sửa trong 0,5.9, xem https://www.mail-archive.com/dash@vger.kernel.org/msg00911.html )
Các triển khai đó xử lý [ ! "(" = ")" ]
như [ ! "(" "text" ")" ]
vậy [ ! "text" ]
(kiểm tra xem "văn bản" có phải là chuỗi rỗng không) trong khi POSIX bắt buộc nó phải là [ ! "x" = "y" ]
(kiểm tra "x" và "y" cho sự bằng nhau). Những triển khai đó thất bại bởi vì họ thực hiện kiểm tra sai trong trường hợp đó.
Lưu ý rằng có một hình thức khác:
! [ "$a" = "$b" ]
Cái đó đòi hỏi phải có vỏ POSIX (sẽ không hoạt động với vỏ Bourne cũ).
Lưu ý rằng một số triển khai đã có vấn đề với [ "$a" = "$b" ]
(và [ "$a" != "$b" ]
) và vẫn làm như tích [
hợp /bin/sh
trên Solaris 10 (vỏ Bourne, vỏ POSIX đang ở trong /usr/xpg4/bin/sh
). Đó là lý do tại sao bạn thấy những thứ như:
[ "x$a" != "x$b" ]
Trong các kịch bản cố gắng để được di động đến các hệ thống cũ.
!(x==y)
từ(!x)==y
.