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
.
해결책
변수를 인용해야 합니다(거의 항상 그렇듯이). 그러면 빈 변수는 완전히 제거되지 않고 빈 매개변수로 처리됩니다.