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)는 ! [[
매우 잘 정의되어 있고 이해하기 쉽습니다. 전체 프로세스를 실행 [[
하고 결과를 무효화합니다.
어느 것을 사용해야 하는가는 개인 취향(및 이해)의 문제입니다.