bash에 차이점이 있습니까, 아니면 진술 부정의 선호 사용법이 있습니까?
if ! [[ -z "${var}" ]]; then
do_something
fi
대
if [[ ! -z "${var}" ]]; then
do_something
fi
답변1
! [[ expression ]]
전체 테스트가 false를 반환하면 true가 됩니다.
[[ ! expression ]]
개별 표현식이 false를 반환하는 경우 이는 true입니다.
테스트는 복합 표현식일 수 있으므로 이는 매우 다를 수 있습니다. 예를 들어:
$ [[ ! 0 -eq 1 || 1 -eq 1 ]] && echo yes || echo no
yes
$ ! [[ 0 -eq 1 || 1 -eq 1 ]] && echo yes || echo no
no
개인적으로 나는 해당되는 경우 테스트 구성 내부에서 부정을 사용하는 것을 선호하지만 의도에 따라 외부에서는 완벽하게 괜찮습니다.
답변2
A ! cmd
는 실제로파이프, 그리고 !
의 종료 코드를 무효화합니다.전체파이프.
남자 배쉬에서 :
파이프라인 파이프라인은 제어 연산자 중 하나로 구분된 하나 이상의 명령 시퀀스입니다. 또는 |&. 파이프라인 형식은 다음과 같습니다.
[time [-p]] [ ! ] command [ [|||&] command2 ... ]
...
예약어인 경우 ! 파이프라인 앞에 있는 경우 해당 파이프라인의 종료 상태는 위에서 설명한 대로 종료 상태의 논리적 부정입니다. 셸은 값을 반환하기 전에 파이프라인의 모든 명령이 종료될 때까지 기다립니다.
그런 의미에서 다음과 같습니다.
! [[ 2 -eq 2 ]]
!
전체 종료 코드 [[
(모두 실행된 후) 의 부정( )입니다 . 따라서 종료 코드는 0입니다.
! [[ 2 -eq 2 && 3 -eq 4 ]]
하지만
A [[ ! ]]
는복합 명령(파이프가 아님). 남자 배쉬에서 :
복합 명령
...
[[ 표현식 ]]
조건식 표현식의 평가에 따라 0 또는 1의 상태를 반환합니다.
표현식은 아래 조건식 아래에 설명된 기본 표현식으로 구성됩니다.
따라서 종료 코드는 1입니다.
[[ ! 2 -eq 2 && 3 -eq 4 ]]
이는 실제로 다음과 동일하기 때문입니다.
[[ ( ! 2 -eq 2 ) && ( 3 -eq 4 ) ]]
단락 평가를 통해 오른쪽은 &&
평가되지 않으며 실제로는 다음과 같은 훨씬 짧은 표현식과 동일합니다.
[[ ! 2 -eq 2 ]]
항상 거짓입니다 (1).
즉, 내부 [[
에는 ! 영향을 미치다부속표현의.
우선의
!
내부 를 사용하는 것이 [[
훨씬 더 일반적이지만(사용하여 더 많은 쉘에 이식 가능 [
) 부정의 범위를 제한하기 위해 를 신중하게 사용하여 명시적으로 제어하지 않으면 때때로 혼란스러울 수 있습니다 ()
(구문 내부에서 문제가 될 수 있음 [
).
그러나 (bash, ksh 및 zsh에서) 결과는 ! [[
매우 명확하게 정의되어 있고 이해하기 쉽습니다. 전체를 실행 [[
하고 결과를 무효화합니다.
어느 것을 사용해야 하는가는 개인 취향(및 이해)의 문제입니다.