내장 테스트에 -n 및 -z 사용 - Bash

내장 테스트에 -n 및 -z 사용 - Bash

Bash에서 다음을 고려하십시오.

root@debian-lap:/tmp I=$(echo)
root@debian-lap:/tmp echo "$I"

root@debian-lap:/tmp [ -z "$I" ] && echo "TRUE" || echo "FALSE"
TRUE

이는 변수 $I가 임을 의미합니다 zero. 변수가 0이 아닌지 확인하고 !변수를 확인하도록 테스트를 되돌리기 위해 부정적인 테스트를 통해 동일한 결과를 얻을 수 있습니다.zero

root@debian-lap:/tmp ! [ -n "$I" ] && echo "TRUE" || echo "FALSE"
TRUE
root@debian-lap:/tmp

그래서 내 질문은 기본적으로 동일한 테스트를 수행하기 때문에 -z사용할 특별한 경우가 있거나 ! -n그 반대의 경우가 있습니까?! -z-n

감사해요

답변1

1. [ -z "$var" ]
2. [ ! -n "$var" ]
3. ! [ -n "$var" ]
4. [ ! "$var" ]
5. [ "$var" = '' ]
6. [ ! "$var" != '' ]
7. [ '' = "$var" ]...²

이 기능은 POSIX 셸과 동일합니다. Bourne 쉘에는 키워드가 없어 위의 3은 지원되지 않으며, !7을 제외한 모든 쉘에는 , , ... $var같은 특수값을 갖는 다양한 버그가 존재합니다(=-n!다른 많은 쉘에도 비슷한 오류가 있습니다).

[ "$a" = "$b" ] && [ "$x" = "$y" ]마찬가지로 더 이상 사용되지 않고 신뢰할 수 없는 대신 을 사용할 수 있고 사용해야 합니다 [ "$a" = "$b" -a "$x" = "$y" ].

3 중 하나는 !POSIX 쉘 함수입니다. test/utility는 이를 사용하고 자체 연산자를 지원하기 위해 조건을 무효화하려는 다른 쉘 또는 비쉘 애플리케이션에 여전히 의미가 있습니다 [(2/6에 표시됨).!

test유틸리티는 Unix v7에서 도입되었습니다. 이전에는 , , , / if가 있는 유틸리티가 !있었지만 / 는 없었습니다 .=!=-a-o-n-z

편의상 -n/를 추가하고 싶었습니다 ( 약어입니다 . 일관성을 위해 추가했습니다).-ztest -n "$var"test "$var" != ''-z


1 기술적으로 test/는 [거의 모든 Bourne 유사 쉘에 내장되어 있지만 POSIX에서는 필수가 아니며 이전 버전의 Bourne 쉘에는 내장되어 있지 않았습니다. Almquist 쉘에는 항상 내장 명령이 있었지만 일부 BSD에서는 이를 활성화하지 않았기 때문에 일부는 2000년대까지 / test내장 되지 않았습니다. [어쨌든 특정 쉘에 / 명령이 내장되어 있는지 여부에 관계없이 모든 POSIX 시스템에는 파일 시스템에 / 명령도 있습니다(이는 쉘의 / 내장 명령과 동일하게 동작할 수도 있고 그렇지 않을 수도 있습니다). 시스템). 체계).testsh[test[test[test

² 이것이 변수가 빈 문자열인지 테스트하는 데 사용할 수 있는 유일한 명령이라는 뜻은 아닙니다.

case $var in
  "") ...
esac

명령을 실행하지 않는 방법입니다.

expr "x$var" : 'x$' > /dev/null
${var:+"false"}
awk 'BEGIN{exit(ARGV[1] != "")}' "$var"
[ "${#var}" -eq 0 ]

복잡한 방법의 예가 더 많이 있습니다.

Korn과 같은 일부 쉘에는 bash조건부 및 산술 기능이 내장되어 있습니다.구조[명령( [[ -z $var ]], ((${#var} == 0))...) 을 대체하도록 설계되었습니다 .

답변2

동일한 이유로 -nand 를 얻으면 다른 테스트 스위트에서는 and , 또는 and 중 하나를 제공합니다. 이중 부정을 피함으로써 일부 테스트 사례는 향후 유지 관리 담당자에게 상황을 더 명확하게 만들 수 있습니다. 또한 위의 설명에서 언급했듯이 현대 POSIX와 달리 고대 버전(예: Bourne 및 Thompson 쉘)에는 표현식의 진실성을 부정하는 키워드가 없습니다.-z==!=ANDNOTshsh!test

관련 정보