미용 적 / 선호 적 주장 외에도, 한 가지 이유는 [ ! "$a" = "$b" ]
with보다 코너 사례 에서 실패한 구현이 더 많기 때문일 수 있습니다 [ "$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.8과 같은 이전 버전은 0.5.9로, sh
예를 들어 우분투 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" ]
POSIX 위임 그것이 될 때 ( "텍스트가"널 문자열인지 시험) [ ! "x" = "y" ]
(시험 "X"와 같은지 "Y"). 이 경우 구현이 잘못된 테스트를 수행하기 때문에 실패합니다.
또 다른 형식이 있습니다.
! [ "$a" = "$b" ]
POSIX 쉘이 필요합니다 (이전 Bourne 쉘에서는 작동하지 않습니다).
참고 여러 구현에 문제가 있었다 [ "$a" = "$b" ]
(그리고 [ "$a" != "$b" ]
뿐만 아니라)를 아직도 좋아한다 [
의 내장 /bin/sh
솔라리스 10의 (a Bourne 쉘의 POSIX 쉘에있는 /usr/xpg4/bin/sh
). 그래서 다음과 같은 것을 보게됩니다.
[ "x$a" != "x$b" ]
오래된 시스템으로 이식 할 수있는 스크립트
!(x==y)
에서를(!x)==y
.