다음 줄을 실행할 때
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
위의 내용은 화면에 어떤 메시지도 표시되지 않습니다.
이것이 예상되는 동작인지 여부는 무엇입니까? 문서 어디에서도 찾을 수 없지만 상당히 반복 가능하고 일관성이 있는 것 같습니다.