test -n <expression>
표현식이 0보다 큰 문자열 길이로 평가되면 false를 반환한다는 것을 알고 있습니다 . 그렇다면 왜 다음과 같은 일이 발생합니까?
Macbook:~ echo ${#undeclared_variable}
0
Macbook:~ test -n $undeclared_variable && echo Foo
Foo
스매시 4.x
내 기대는 test -n $undeclared_variable
false로 평가되어야 하므로 Foo가 에코되지 않아야 한다는 것입니다. [[ ]]
테스트 대신 사용하면 예상대로 작동합니다.
답변1
변수를 인용해야합니다. 따옴표가 없으면 test -n
대신 쓰고 있는 것입니다 test -n <expression>
. 이 test
명령은 아무것도 확장되지 않은 변수를 제공했음을 알 수 없습니다.
POSIX 쉘 구문에서 bash
큰 $VARIABLE
따옴표 외부에는 "split+glob" 연산자가 있습니다. 변수의 값은 공백으로 구분된 단어 목록으로 분할되며, 각 단어는 와일드카드 패턴으로 해석되어 이름으로 대체됩니다. 일치하는 파일(일치하는 파일이 없으면 그대로 남습니다). 변수 값이 비어 있으면 분할 단어 목록은 빈 목록입니다. 추가 처리 없이 변수 값을 얻으려면 변수 확장을 큰따옴표로 묶어야 합니다.
이는 [[
명령이 아닌 bash 특수 구문이기 때문에 작동합니다. 이 특수 구문에서는 "값"을 의미합니다( 및 오른쪽의 $VARIABLE
패턴 일치 연산자 제외 ). VARIABLE
사용되는 기능은 와 동일합니다. 다음은 귀하의 요구 사항을 충족할 수 있습니다.=
==
!=
=~
[
test
test -n "$undeclared_variable" && echo "Foo"