같지 않음의 구문이 중요합니까?

같지 않음의 구문이 중요합니까?

스크립트를 작성할 때 일반적으로 다음 구문을 사용하면 다음에 일어나는 일이 올바르지 않다는 것을 더 쉽게 이해할 수 있기 때문에 작성합니다.

if [ ! "$1" = "$2" ]; then

어떤 사람들은 다음 방법이 더 좋다고 말합니다.

if [ "$1" != "$2" ]; then

문제는 왜, 어떤 차이가 있는지 물었을 때 아무도 대답을 하지 못하는 것 같다는 것입니다.

그렇다면 이 두 구문 사이에 차이점이 있나요? 하나가 다른 것보다 안전합니까? 아니면 이것은 단지 선호/습관의 문제입니까?

답변1

[ ! "$a" = "$b" ]장식/기본 설정 매개변수 외에도 특별한 경우에 실패하는 구현 비율이 이유 중 하나일 수 있습니다 [ "$a" != "$b" ].

구현이 다음과 같은 경우 두 경우 모두 안전해야 합니다.POSIX 알고리즘, 그러나 오늘날(이 글을 쓰는 시점인 2018년 초)에도 여전히 실패한 구현이 있습니다. 예를 들어 다음과 같습니다 a='(' b=')'.

$ (a='(' b=')'; busybox test "$a" != "$b"; echo "$?")
0
$ (a='(' b=')'; busybox test ! "$a" = "$b"; echo "$?")
1

0.5.9 이전 버전(예: Ubuntu 16.04의 dash0.5.8 ):sh

$ a='(' b=')' dash -c '[ "$a" != "$b" ]; echo "$?"'
0
$ a='(' b=')' dash -c '[ ! "$a" = "$b" ]; echo "$?"'
1

(0.5.9에서 수정되었습니다. 참조)https://www.mail-archive.com/[이메일 보호됨]/msg00911.html)

이러한 구현에서는 이를 그대로 처리 [ ! "(" = ")" ]( "text"가 빈 문자열인지 [ ! "(" "text" ")" ]테스트 )하는 반면, POSIX에서는 이를 의무화합니다 ("x"와 "y"가 동일한지 테스트). 이 경우 잘못된 테스트를 수행하기 때문에 이러한 구현은 실패합니다.[ ! "text" ][ ! "x" = "y" ]

다른 형식도 있습니다.

! [ "$a" = "$b" ]

여기에는 POSIX 쉘이 필요합니다(이전 Bourne 쉘에서는 사용할 수 없음).

알아채다일부 구현 [ "$a" = "$b" ]에서는 (and) 문제 도 발생했습니다.[ "$a" != "$b" ]그리고 여전히 Solaris 10의 [내장 기능 /bin/sh(Bourne 쉘, 의 POSIX 쉘 /usr/xpg4/bin/sh)과 같습니다. 그렇기 때문에 다음과 같은 내용이 표시됩니다.

[ "x$a" != "x$b" ]

이전 시스템으로 포팅하려는 스크립트에서.

답변2

구문은 오류가 발생하기 쉽기 x != y때문에 더 좋습니다 ! x == y. 다양한 언어의 연산자 우선 순위를 이해해야 합니다. 구문은 대 우선 순위 에 따라 또는 ! x == y로 해석될 수 있습니다 .!(x == y)(!x) == y!=


예를 들어 c++부정 에서는! 비교/관계 연산자 앞에 나타납니다. ==이므로 다음과 같은 코드가 있습니다.

#include<iostream>

using namespace std;

int main()
{
  int x=1, y=2;
  if(     x  != y   ) cout<<"true"<<endl; else cout<<"false"<<endl;
  if(  !  x  == y   ) cout<<"true"<<endl; else cout<<"false"<<endl;
  if(  !( x  == y ) ) cout<<"true"<<endl; else cout<<"false"<<endl;
  if(   (!x) == y   ) cout<<"true"<<endl; else cout<<"false"<<endl;
}

반품

true
false
true
false

awkUnix 세계에서 일반적으로 사용되는 도구를 포함하여 다른 많은 언어에서도 유사한 동작을 볼 수 있습니다 .


반면, x != y검증된 모델로서 운영자를 하나로 모아도 혼란이 발생하지 않습니다. 또한 기술적으로는 !=일반적으로 두 명이 아닌 한 명의 연산자가 있으므로 평가는 개별적으로 비교하고 부정하는 것보다 약간 더 빠릅니다. 따라서 두 구문을 모두 bash에서 사용할 수 있지만 x != y일부 표준 논리를 따르는 코드가 읽고 유지하기 쉽기 때문에 이 구문을 따르는 것이 좋습니다.

답변3

이런 일은매우관점에 따라 "답변"은 개인의 두뇌가 어떻게 연결되어 있는지에 따라 크게 좌우됩니다. 실제로 의미상으로는 NOT ( A == B )동일 하지만 (A != B )하나는 더 잘 알 수도 있고 다른 하나는 더 잘 알 수도 있습니다. 또한 상황에 따라 다릅니다. 예를 들어, 플래그를 설정하면 다른 구문보다 한 구문을 사용하면 의미가 더 명확해질 수 있습니다.

if NOT ( fileHandleStatus == FS_OPEN )

상대적인

if ( fileHandleStatus != FS_OPEN )

관련 정보