2013-02-16 4 views
1

나는 다음 bash 명령의 출력에 대한 질문을했다 걸렸 최근 검사 :배쉬 널 (null) 이항 연산자

var=; [ -n $var ]; echo $?; [ -z $var ]; echo $? 

결과는 단항 연산자 모두 오류가 없었의 반환 코드를 나타내는 00 있습니다. 이것은 $varnull (비어 있음)과 'non-null'(비어 있지 않음) 모두로 해석된다는 것을 의미합니다. 맞습니까?

어떻게 가능합니까?

+0

이들은 단항 연산자입니다. –

+0

'info coreutils 테스트 호출' 16.3.4 문자열 테스트 – tijagi

답변

3

아니요, 이는 [이 고정적으로 손상되었음을 의미합니다. 두 경우 모두 $var은 아무 것도 평가하지 않으며 명령은 각각 [ -n ][ -z ]을 실행하며 둘 다 true가됩니다. 변수 자체의 값을 테스트하려면 올바르게 처리하기 위해 값을 인용해야합니다.

$ var=; [ -n "$var" ]; echo $?; [ -z "$var" ]; echo $? 
1 
0 
+0

'unfixably broken'이 아닙니다; 단지 비 직관적 인 행동을합니다. '[-n]'문자열은'-n' 문자열이 null이 아니며'-z' 문자열이'-z' 문자열이 올바르지 않다고 정확하게보고합니다. –

1

참으로 놀랍습니다. bashism [[ 구문으로 동일하게 시도한다면 10을 결과로 얻을 수 있습니다. 나는 이것이 버그라고 생각한다.

var=; [[ -n $var ]]; echo $?; [[ -z $var ]]; echo $? 

또는, 이그나시오는 지적하고 사실 나는 항상 방어적인 코딩, 직관적으로 일을하고 인용 된대로 : 그것은이 때문에

var=; [[ -n "$var" ]]; echo $?; [[ -z "$var" ]]; echo $? 

그것은 [ 이런 식으로 동작하는지 나에게 놀라운 일 내장 :


$ type [ 
[ is a shell builtin 
그냥 한 약간의 테스트 및 시스템 명령 [은 내장 된 것과 동일한 방법으로 작동합니다. 그래서 아마 그것은 호환성 버그입니다 :

var=; /usr/bin/\[ -n $var ]; echo $?; /usr/bin/\[ -z $var ]; echo $? 
+0

'[''는''default-by-default ''행동에 의존하는 스크립트 때문에 수정 될 수없는 레거시 행동을 많이합니다. Windows API와 비슷합니다. –

+0

@ 이그나시오 바스케스 - 에이 브람스 : 방금 알아 챘습니다. 흥미 롭 군. – 0xC0000022L

2

당신은 $ var에 둘러싸해야합니다

$ [ -n "$var" ]; echo $? 
1 

는 닫는 대괄호 그냥 문법 설탕 것을 기억하십시오 : 당신이 그것을 필요하지 않습니다. (가) 위의 요청

$ [ -n ]; echo $? 

:

$ [ -n $var ]; echo $? 

가 ($ var에이 비어 있으므로)로 확장됩니다 : 그것은 당신의 라인을 의미? "문자열 ']'비 비어를" 그리고 대답은 '예'입니다.

+0

'[''은 구문이 아니며 실제로'test' 명령의 동의어입니다 만,'[''와'[''를 사용해야합니다. – chepner