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
/를 추가하고 싶었습니다 ( 약어입니다 . 일관성을 위해 추가했습니다).-z
test -n "$var"
test "$var" != ''
-z
1 기술적으로 test
/는 [
거의 모든 Bourne 유사 쉘에 내장되어 있지만 POSIX에서는 필수가 아니며 이전 버전의 Bourne 쉘에는 내장되어 있지 않았습니다. Almquist 쉘에는 항상 내장 명령이 있었지만 일부 BSD에서는 이를 활성화하지 않았기 때문에 일부는 2000년대까지 / test
내장 되지 않았습니다. [
어쨌든 특정 쉘에 / 명령이 내장되어 있는지 여부에 관계없이 모든 POSIX 시스템에는 파일 시스템에 / 명령도 있습니다(이는 쉘의 / 내장 명령과 동일하게 동작할 수도 있고 그렇지 않을 수도 있습니다). 시스템). 체계).test
sh
[
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
동일한 이유로 -n
and 를 얻으면 다른 테스트 스위트에서는 and , 또는 and 중 하나를 제공합니다. 이중 부정을 피함으로써 일부 테스트 사례는 향후 유지 관리 담당자에게 상황을 더 명확하게 만들 수 있습니다. 또한 위의 설명에서 언급했듯이 현대 POSIX와 달리 고대 버전(예: Bourne 및 Thompson 쉘)에는 표현식의 진실성을 부정하는 키워드가 없습니다.-z
==
!=
AND
NOT
sh
sh
!
test