Bash에서 if ! [[ foo ]] 와 if [[ ! foo ]] 의 차이점은 무엇입니까?

Bash에서 if ! [[ foo ]] 와 if [[ ! foo ]] 의 차이점은 무엇입니까?

Bash에서 if 조건을 부정하는 데 사용되는 것으로 알고 있지만 !다음 형식을 사용하는 코드를 보았습니다.

if ! [[ CONDITION ]]; then
    SOMETHING
fi

이 형식과 아래 형식 사이에 차이가 있나요?

if [[ ! CONDITION ]]; then
    SOMETHING
fi

Google에 시도해 보았지만 이전 구문에 대해서는 아직 아무것도 찾지 못했습니다.

답변1

단일 조건의 경우 둘 다 동일합니다.

$ if [[ ! 1 = 1 ]]; then echo true; else echo false; fi
false
$ if ! [[ 1 = 1 ]]; then echo true; else echo false; fi
false

여러 조건을 테스트할 때 차이점이 발생합니다.

$ if  [[ ! 1 = 2 || 2 = 2 ]]; then echo true; else echo false; fi
true
$ if  ! [[ 1 = 2 || 2 = 2 ]]; then echo true; else echo false; fi
false

따라서 외부 부정이 결과에 더 우선순위를 갖습니다.

물론 전체 조건에 대해 내부 부정을 적용할 수 있으므로 이 경우 대신 외부 부정을 사용하는 것이 좋습니다.

$ if  [[ ! ( 1 = 2 || 2 = 2 ) ]]; then echo true; else echo false; fi
false

답변2

if ! [[ CONDITION ]]; then

첫 번째는 !파이프라인 구문에서 가져온 것입니다.

   A pipeline is a sequence of one or more commands separated by one of the control
   operators | or |&.  The format for a pipeline is:

          [time [-p]] [ ! ] command [ [|⎪|&] command2 ... ]

   If the reserved word ! precedes a pipeline, the exit status of that pipeline is 
   the logical negation of the exit status as described above.

두 번째 예:

if [[ ! CONDITION ]]; then

표현식은 다음과 같습니다.

  [[ expression ]]
  Execute conditional command.

  ! EXPRESSION              True if EXPRESSION is false; else false

답변3

Bash 맨페이지에서:

[[ expression ]]

조건식의 평가에 따라 0 또는 1의 상태를 반환합니다 expression.

그래서,

[[ condition ]]

0조건이 "true"로 평가되면 반환되고 , 1그렇지 않으면 !전체 결과가 부정됩니다. 이는 논리적으로 테스트 내부의 전체 조건을 부정하는 것과 같습니다.

이런 종류의 부정은 테스트 구성보다는 외부 명령의 결과를 테스트할 때 더 일반적입니다(예:

if ! grep -q "pattern" file

패턴이 파일에서 발견되지 않으면 코드를 실행하므로 내부 테스트 구성이 존재하지 않고 [ condition ]테스트 명령 [(때로는 외부, 때로는 내장)을 호출하는 테스트가 사용된 시간/셸에서 발생할 수 있습니다.

답변4

첫 번째 부정은 에 의해 수행됩니다 if. 두 번째는 에 의해 수행됩니다 [[. 간단한 경우에는 차이가 없습니다.

그러나 둘 다 때때로 필요합니다.

  • if [[ ! a && b ]][[능력이 필요합니다.
  • if ! ls지금은 if그것이 필요합니다.

관련 정보