ข้างข้อโต้แย้งเครื่องสำอาง / การตั้งค่า, เหตุผลหนึ่งที่อาจเป็นไปได้ว่ามีการใช้งานมากขึ้นที่ล้มเหลวในกรณีมุมกว่าด้วย[ ! "$a" = "$b" ]
[ "$a" != "$b" ]
ทั้งสองกรณีควรมีความปลอดภัยหากการใช้งานเป็นไปตามอัลกอริทึม POSIXแต่ถึงแม้ในปัจจุบัน ตัวอย่างเช่นด้วยa='(' b=')'
:
$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1
สำหรับdash
รุ่นก่อนหน้า 0.5.9 เช่น 0.5.8 ที่พบsh
ใน Ubuntu 16.04 เช่น:
$ 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" ]
(ทดสอบว่า "text" เป็นสตริงว่าง) หรือไม่ในขณะที่ POSIX บังคับให้เป็น[ ! "x" = "y" ]
(ทดสอบ "x" และ "y" เพื่อความเท่าเทียมกัน) การใช้งานเหล่านั้นล้มเหลวเนื่องจากทำการทดสอบผิดในกรณีนั้น
โปรดทราบว่ายังมีรูปแบบอื่น:
! [ "$a" = "$b" ]
อันนั้นต้องใช้ POSIX เชลล์ (จะไม่ทำงานกับเชลล์เป้าหมายเดิม)
โปรดทราบว่าการใช้งานหลายอย่างมีปัญหากับ[ "$a" = "$b" ]
(และ[ "$a" != "$b" ]
) เช่นกันและยังคงเหมือน[
builtin ของ/bin/sh
บน Solaris 10 (Bourne shell, POSIX เชลล์ที่อยู่ใน/usr/xpg4/bin/sh
) นั่นเป็นเหตุผลที่คุณเห็นสิ่งต่าง ๆ เช่น:
[ "x$a" != "x$b" ]
ในสคริปต์ที่พยายามพกพาไปยังระบบเก่า
!(x==y)
(!x)==y