우선의

우선의

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에서) 결과는 ! [[매우 명확하게 정의되어 있고 이해하기 쉽습니다. 전체를 실행 [[하고 결과를 무효화합니다.

어느 것을 사용해야 하는가는 개인 취향(및 이해)의 문제입니다.

관련 정보