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
그것이 필요합니다.