-n이 빈 문자열을 포함하는 인용되지 않은 변수에 대해 true를 반환하는 이유는 무엇입니까? [복사]

-n이 빈 문자열을 포함하는 인용되지 않은 변수에 대해 true를 반환하는 이유는 무엇입니까? [복사]

에서 man bash:

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

예:

# expected
$ var=""; [ -n "$var" ]; echo $?
1

# unexpected?
$ var=""; [ -n $var ]; echo $?
0

-n여기서는 빈 문자열을 포함하는 따옴표가 없는 변수가 true를 반환하는 것을 볼 수 있습니다 . 왜?

$var여기에 견적이 필요한 이유 는 무엇입니까 ?

답변1

$ 기호는 매개변수 확장, 명령 대체 또는 산술 확장을 소개합니다.

두 번째 경우( $var따옴표 없음) $var는 비어 있으므로 null로 확장됩니다. 테스트에 피연산자를 지정하지 않은 것과 같습니다.

첫 번째 경우 ( $var큰따옴표)는 $var큰따옴표 안에 있는 내용을 제외한 모든 항목으로 확장됩니다. 이는 우연히 빈 문자열을 ""테스트의 피연산자로 제공합니다.


업데이트 내용은 다음과 같습니다댓글에 있는 OP의 추가 질문:

피연산자 없이 -n을 실행하면 "오류: -n에는 피연산자가 필요합니다"가 발생하지 않는 이유는 무엇입니까?

이에 대한 나의 초기 대답은 다음과 같습니다.수동, 시험

상태 0(true) 또는 1(false)로 종료

오류에는 다음 상황이 포함됩니다."잘못된 인수가 주어졌습니다.".

일부일카츄의 코멘트더 깊은 통찰력을 제공합니다.

일부 테스트 구현(Bash 포함)은 실제로 명시적인 오류 상태를 반환하는데, 이는 참이면 0, 거짓이면 1, 오류이면 2입니다.

하지만:

쉘 조건에 관한 한 1과 2는 모두 거짓입니다.

관련 정보