첫번째 선택

첫번째 선택

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 ... ]

...
예약어인 경우! 파이프 이전에 파이프의 종료 상태는 위의 종료 상태에 대한 논리적 부정입니다. 셸은 값을 반환하기 전에 파이프라인의 모든 명령이 종료될 때까지 기다립니다.

이러한 의미에서 a는 다음과 같습니다.

! [[ 2 -eq 2 ]]

!전체 종료 코드를 부정하는 것입니다 [[(모두 실행된 후). 따라서 종료 코드는 0입니다.

!  [[ 2 -eq 2 && 3 -eq 4 ]]

하지만

A [[ ! ]]복합 명령(파이프가 아님). 남자 배쉬에서 :

복합 명령
...
[[expression]]은
조건식 표현식의 평가에 따라 0 또는 1의 상태를 반환합니다.
표현식은 아래 조건식에 설명된 주요 요소로 구성됩니다.

따라서 종료 코드는 1입니다.

[[ ! 2 -eq 2 && 3 -eq 4 ]]

이는 실제로 다음과 동일하기 때문입니다.

[[ ( ! 2 -eq 2 ) && ( 3 -eq 4 ) ]]

단락 평가를 사용하면 오른쪽은 &&평가되지 않으며 이는 훨씬 더 짧은 표현식과 사실상 동일합니다.

[[ ! 2 -eq 2 ]]

이것은 항상 잘못된 것입니다 (1).

한마디로 : 내부 [[,! 영향부분표현.

첫번째 선택

!내부를 사용하는 것이 [[더 일반적이지만(더 많은 쉘에 이식 가능), [부정의 범위가 현명한 사용을 통해 명시적으로 제어되지 않으면 때때로 혼란스러울 수 있습니다(구문 내부에서 문제가 될 수 있음).()[

그러나 결과(bash, ksh 및 zsh)는 ! [[매우 잘 정의되어 있고 이해하기 쉽습니다. 전체 프로세스를 실행 [[하고 결과를 무효화합니다.

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

관련 정보