कॉस्मेटिक / वरीयता के तर्कों के अलावा, एक कारण यह भी हो सकता है कि अधिक क्रियान्वयन ऐसे हों जहां [ ! "$a" = "$b" ]
कोने के मामलों में असफलता हो [ "$a" != "$b" ]
।
यदि कार्यान्वयन POSIX एल्गोरिथ्म का पालन करते हैं , तो दोनों मामले सुरक्षित होने चाहिए , लेकिन आज भी (2018 की शुरुआत में लेखन के रूप में), अभी भी ऐसे कार्यान्वयन हैं जो विफल हो जाते हैं। उदाहरण के लिए, इसके साथ a='(' b=')'
:
$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1
dash
0.5.9 से पहले के संस्करणों के साथ , sh
उदाहरण के लिए Ubuntu 16.04 पर 0.5.8 जैसा पाया गया :
$ a='(' b=')' dash -c '[ "$a" != "$b" ]; echo "$?"'
0
$ a='(' b=')' dash -c '[ ! "$a" = "$b" ]; echo "$?"'
1
(0.5.9 में तय किया गया, https://www.mail-archive.com/dash@vger.kernel.org/msg00911.html देखें )
उन कार्यान्वयन का इलाज [ ! "(" = ")" ]
के रूप में [ ! "(" "text" ")" ]
वह यह है कि [ ! "text" ]
(परीक्षण है कि क्या "पाठ" अशक्त स्ट्रिंग है) POSIX जनादेश इसे होने की जबकि [ ! "x" = "y" ]
(परीक्षण "x" और समानता के लिए "Y")। वे कार्यान्वयन विफल हो जाते हैं क्योंकि वे उस मामले में गलत परीक्षण करते हैं।
ध्यान दें कि अभी एक और रूप है:
! [ "$a" = "$b" ]
उस व्यक्ति को POSIX शेल की आवश्यकता होती है (पुराने बॉर्न शेल के साथ काम नहीं करेगा)।
ध्यान दें कि कई कार्यान्वयनों के साथ [ "$a" = "$b" ]
(और [ "$a" != "$b" ]
) के साथ समस्याएं थीं और अभी भी सोलारिस 10 (एक बॉर्न शेल, पोसिक्स शेल के अंदर ) पर [
बिल्टिन की तरह है । इसलिए आप चीजों को देखते हैं:/bin/sh
/usr/xpg4/bin/sh
[ "x$a" != "x$b" ]
पुराने सिस्टम में पोर्टेबल होने की कोशिश करने वाली स्क्रिप्ट में।
!(x==y)
से(!x)==y
।