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 dash
olarak 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/sh
Solaris 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
.