질문

질문

man test페이지 에서 :

-n STRING
    the length of STRING is nonzero

STRING equivalent to -n STRING

-z STRING
    the length of STRING is zero

실행 [ -n $foo ],,,, [ -n ]모두 true를 [ -z $foo ]반환합니다 [ -z ]. 이것은 단지 엉성한 반환 값입니까? 설정되지 않은 변수는 문자열이 아닙니다. 표현이 완전히 생략된 것도 아닙니다. 어떻게든 1이 되도록 "강제"된다고 하더라도 그 길이가 동시에 0이면서 동시에 0이 아닐 수 있다고 생각하고 싶지 않습니다.

실제로 둘 다

if [ -n ] && [ -z ]; then 
   echo 1; 
fi
# AND
if [ -n $foo ] && [ -z $foo ]; then 
   echo 1; 
fi

...두 가지를 모두 생성합니다 "1". 왜? 여기서 무슨 일이 일어나고 있는 걸까요?

답변1

질문

테스트 조건을 구문 분석하는 방법을 오해했습니다.

첫 번째 bash는 매개변수 수를 결정합니다.

  • [과 사이에는 ]거짓 이 없습니다.
  • 매개변수가 비어 있는 경우 true매개변수의 내용에 관계없이 매개변수 사이에는 빈 매개변수 가 아닌 하나의 매개변수만 있습니다.false[ '' ]
  • 쉘은 인수가 여러 개 있는 경우에만 내용을 확인합니다.

-z-n두 번째 매개변수가 필요합니다 . 귀하의 케이스에는 케이스가 없으므로 -z/ 로 처리되지 않고 -n결과적으로 처리됩니다 true.

해결책

변수를 인용해야 합니다(거의 항상 그렇듯이). 그러면 빈 변수는 완전히 제거되지 않고 빈 매개변수로 처리됩니다.

관련 정보