Kozmetik / tercih argümanlarının yanı sıra, sebeplerden biri [ ! "$a" = "$b" ], köşe durumlarda başarısız olanlardan daha fazla uygulama yapılması olabilir [ "$a" != "$b" ].
Eğer uygulamalar POSIX algoritmasını takip ederse her iki durum da güvenli olmalı , ancak bugün bile (2018'in başlarında) hala başarısız olan uygulamalar var. Örneğin, şununla a='(' b=')':
$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1
İle dasholarak bulundu 0.5.8 gibi sürümler önce 0.5.9 için, shörneğin Ubuntu 16.04 tarih:
$ a='(' b=')' dash -c '[ "$a" != "$b" ]; echo "$?"'
0
$ a='(' b=')' dash -c '[ ! "$a" = "$b" ]; echo "$?"'
1
(0.5.9'da düzeltildi, bkz. https://www.mail-archive.com/dash@vger.kernel.org/msg00911.html )
Bu uygulamalar tedavi [ ! "(" = ")" ]olarak [ ! "(" "text" ")" ]olmasıdır [ ! "text" ]POSIX görev olması için ise ( "metin" boş dizge olup testi) [ ! "x" = "y" ](test, "x" ve eşitlik "y"). Bu uygulamalar başarısız olur, çünkü bu durumda yanlış testi yaparlar.
Başka bir form daha olduğuna dikkat edin:
! [ "$a" = "$b" ]
Bu bir POSIX kabuğu gerektirir (eski Bourne kabuğu ile çalışmaz).
Not, çeşitli uygulamaları ile ilgili sorunlar vardı [ "$a" = "$b" ](ve [ "$a" != "$b" ]onunla birlikte) ve yine gibi yapın [bir yerleşiği /bin/shSolaris 10 (a Bourne kabuğu POSIX kabuk olmak /usr/xpg4/bin/sh). Bu yüzden şöyle şeyler görüyorsunuz:
[ "x$a" != "x$b" ]
Scriptlerde eski sistemlere taşınabilir olmaya çalışıyor.
!(x==y)dan(!x)==y.