2011-11-22 4 views
3

-z으로 문자열이 비어 있는지 테스트하고 문자열이 비어 있지 않은지 여부를 -n으로 테스트 할 수 있다는 것을 알고 있습니다. 그래서 우분투 10.10에서 스크립트 작성 : 놀랍게도bash 빈 문자열 비교 문제

#!/bin/bash 
A= 
test -z $A && echo "A is empty" 
test -n $A && echo "A is non empty" 
test $A && echo "A is non empty" 

str="" 
test -z $str && echo "str is empty" 
test -n $str && echo "str is non empty" 
test $str && echo "str is non empty" 

을, 그것은 출력 :

A is empty 
A is non empty 
str is empty 
str is non empty 

나는 것은 그것은 어떤 리눅스 전문가가 이유를 설명 할 수

A is empty 
str is empty 

을해야 하는가?

감사합니다.

답변

5

이것은 배시 명령 줄을 구문 분석하는 방식의 결과입니다. 변수 대체는 (초보적인) 구문 트리를 만들기 전에 발생하므로 -n 연산자는 빈 문자열을 인수로 사용하지 않으므로 인수가 전혀 없습니다.! 그냥

#!/bin/bash 
A= 
test -z "$A" && echo "A is empty" 
test -n "$A" && echo "A is non empty" 
test $A && echo "A is non empty" 

str="" 
test -z "$str" && echo "str is empty" 
test -n "$str" && echo "str is non empty" 
test $str && echo "str is non empty" 

: 일반적으로, 당신이 하나가 작동 당신이 할 수없는 긍정적으로 확인 비어, 정확히 이것과 비슷한 문제

5

'문제는'이에서 온다 : 인수없이

$ test -n && echo "Oh, this is echoed." 
Oh, this is echoed. 

test -n 0/OK를 반환합니다.

변경 것과 :

$ test -n "$A" && echo "A is non empty" 

당신은 당신이 기대하는 결과를 얻을 수 있습니다.

2

을 피하지 않는 것입니다 ""에 어떤 변수 참조로 묶어야합니다 빈 문자열 인 $ A 또는 $ str은 test 매개 변수가 아니며 하나의 매개 변수 (길이가 0이 아닌 문자열)를 사용하면 테스트 상태가 항상 true입니다. 마지막 줄은 매개 변수없이 테스트가 항상 false를 반환하기 때문에 올바르게 작동합니다.