bash - 문자열 길이가 0(0이 아닌)이면 참입니까? [복사]

bash - 문자열 길이가 0(0이 아닌)이면 참입니까? [복사]
# touch $$
# gzip $$
# gzip --test $$.gz
# echo $?
0
# OUT=$(gzip --test $$.gz)
# echo $OUT

# if [ -z $OUT ] ; then echo $$ ; fi
26521
# if [ -n $OUT ] ; then echo $$ ; fi
26521
# 

~에서bash(1)

   -z string
          True if the length of string is zero.
   string
   -n string
          True if the length of string is non-zero.

혼란스러워요. 어떻게 0이 될 수 있죠?그리고동시에 0이 아닌가요? 키에 값(사용됨)이 있는지 확인하는 방법은 무엇입니까 bash?

답변1

[ .. ]다른 모든 명령과 동일한 규칙을 따릅니다.분사적용 가능합니다. OUT비어 있거나 설정되지 않은 경우 $OUT빈 인수가 아니더라도 아무 것도 확장되지 않습니다.

따라서 , 및 [ -n $OUT ]으로 확장되어 빈 문자열이 아닌지 테스트 합니다 . 예, 테스트는 true를 반환합니다.[-n][-n

$OUT다른 곳과 마찬가지로 견적이 필요합니다 .

if [ -n "$OUT" ]; then ...

바라보다:언제 큰따옴표가 필요합니까? 그리고테스트 및 조건BashGuide에서.

답변2

주문하다

[ -z $OUT ]

정확히 같다

test -z $OUT

비어 있으면 $OUT다음과 같습니다.

test -z

행동test 매개변수 개수에 따라 다름명령줄에 제공됩니다. test -nor와 같이 단일 인수만 주어지고 test -z해당 인수의 길이(문자열로 해석될 때)가 0이 아닌 경우 결과는 "true"입니다.

즉, $OUT비어 있고 따옴표가 없으면 및 둘 다 길이가 0이 아닌 문자열이기 때문에 둘 다 참 이 test -z $OUT됩니다 test -n $OUT.-z-n

이 문제를 해결하려면 변수 확장을 큰따옴표로 묶으십시오.

[ -n "$OUT" ]

당신은 또한 볼 수 있습니다

관련 정보