"test -n && echo notempty"는 "notempty"를 인쇄합니다. 이것이 예상되는 동작입니까?

"test -n && echo notempty"는 "notempty"를 인쇄합니다. 이것이 예상되는 동작입니까?

다음 줄을 실행할 때

test -n && echo not empty

"비어있지 않음"을 인쇄합니다. 이는 빈 변수가 있고 null이 아닌지 테스트하고 값을 인용하는 것을 잊었을 때 발생합니다.

VAR=
test -n  $VAR  && echo wrong 1
test -n "$VAR" && echo wrong 2

이것이 예상되는 동작입니까?

답변1

예, 이는 예상된 동작입니다. 하나의 인수만 에 전달되면 test길이 확인이 수행됩니다. 에서 man bash:

test 및 [ 인수 수에 따라 일련의 규칙을 사용하여 조건식을 평가합니다.

인수 0개: 표현식이 거짓입니다.

매개변수 1개: 매개변수가 비어 있지 않은 경우에만 표현식이 true입니다.

즉, 본질적으로 와 동일 test foo하지만 -n문자열로 사용됩니다.

답변2

test -n일견의 증거-n매개변수가 필수 이므로 형식이 잘못되었습니다 . 일부 역사적 구현에서는 이를 구문 오류로 처리하고 0이 아닌 상태를 반환했다고 생각합니다. 그러나 21세기에 접할 가능성이 있는 모든 쉘에서는 동작이 잘 정의되어 있습니다(다음을 통해).POSIX, 기존 규칙을 따름): test인수가 하나만 있는 경우 해당 인수가 null이 아닌 경우에만 true입니다.

따옴표가 생략되면 null이 아닌 일부 값에 대해 테스트가 false가 될 수 있습니다 $VAR. 와일드카드 문자가 있으면 오류 메시지를 인쇄할 수도 있습니다 $VAR.

VAR='foo -a -z bar'; test -n $VAR || echo "true... and false is false"
VAR='= n-'; test -n $VAR || echo "this is an equality test"
VAR='*'; test -n $VAR || echo "you may or may not see this depending on what files are in the current directory"

test -z $VAR또한 깨졌습니다.

Ksh, bash 및 zsh는 [[ … ]]기존 프로그램 test[유틸리티 프로그램을 모방한 조건부 구조를 가지고 있습니다. 와 달리 외부 유틸리티이거나 셸 구문의 일부인 구문 [분석과 같은 내장 유틸리티입니다 . [[ … ]]내부에는 단어 분리기나 와일드카드가 없습니다 [[ … ]]. [[ -n $VAR ]]문제 없습니다(스크립트가 ash와 같은 다른 셸에서 실행되지 않는 한).

답변3

또한 확인하십시오 [[ ... ]]. 다음과 같이 작동하지 않습니다.

[[ -n $VAR ]] && echo wrong 3
[[ -n "$VAR" ]] && echo wrong 4

답변4

다음을 수행하면 나타나는 것 같습니다.

VAR=
test -n $VAR && echo helloworld

인수가 존재하지 않는 것처럼 처리합니다.

test -n && echo helloworld

그리고 어떤 이유로 인수가 제공되지 않으면 항상 나중에 명령을 실행합니다(예: helloworld 표시). 나는 이것을 다른 단항 연산자에 시도했고 같은 일을 했습니다:

FILENAME=
test -f $FILENAME && echo helloworld

예상되는 동작을 얻으려면 다음 주장을 인용해야 한다고 생각합니다.

VAR=
test -n "$VAR" && echo helloworld
FILE=
test -f "$FILE" && echo helloworld

위의 내용은 화면에 어떤 메시지도 표시되지 않습니다.

이것이 예상되는 동작인지 여부는 무엇입니까? 문서 어디에서도 찾을 수 없지만 상당히 반복 가능하고 일관성이 있는 것 같습니다.

관련 정보