스크립트를 작성할 때 일반적으로 다음 구문을 사용하면 다음에 일어나는 일이 올바르지 않다는 것을 더 쉽게 이해할 수 있기 때문에 작성합니다.
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의 dash
0.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
awk
Unix 세계에서 일반적으로 사용되는 도구를 포함하여 다른 많은 언어에서도 유사한 동작을 볼 수 있습니다 .
반면, x != y
검증된 모델로서 운영자를 하나로 모아도 혼란이 발생하지 않습니다. 또한 기술적으로는 !=
일반적으로 두 명이 아닌 한 명의 연산자가 있으므로 평가는 개별적으로 비교하고 부정하는 것보다 약간 더 빠릅니다. 따라서 두 구문을 모두 bash에서 사용할 수 있지만 x != y
일부 표준 논리를 따르는 코드가 읽고 유지하기 쉽기 때문에 이 구문을 따르는 것이 좋습니다.
답변3
이런 일은매우관점에 따라 "답변"은 개인의 두뇌가 어떻게 연결되어 있는지에 따라 크게 좌우됩니다. 실제로 의미상으로는 NOT ( A == B )
동일 하지만 (A != B )
하나는 더 잘 알 수도 있고 다른 하나는 더 잘 알 수도 있습니다. 또한 상황에 따라 다릅니다. 예를 들어, 플래그를 설정하면 다른 구문보다 한 구문을 사용하면 의미가 더 명확해질 수 있습니다.
if NOT ( fileHandleStatus == FS_OPEN )
상대적인
if ( fileHandleStatus != FS_OPEN )