test 명령에서 -z 옵션은 무엇입니까 (linux)


4

실습 자습서 중 하나에서 확인할 명령이있었습니다.

test -z $LOGNAME || echo Logname is not defined

이 명령을 실행할 때 출력은 "Logname is not defined"입니다. 테스트 용 맨 페이지

> -z STRING
>               the length of STRING is zero

$ LOGNAME을 반향하면 로그인 이름이 인쇄됩니다. 따라서 $ LOGNAME에 대한 값이 있습니다. 명령의 오른쪽 부분이 실행되었으므로 위의 첫 번째 명령에서 왼쪽 부분이 false를 반환했음을 나타냅니다. $ LOGNAME에 값이있을 때 왜 false를 반환합니까?


1
"제로 길이"와 "정의되지 않음"사이에는 큰 차이가 있습니다. STRING=''길이가 0 인 문자열을 정의합니다. -z시험에 대한 옵션은 정의되지 않았거나 길이가 제로 구분하지 않습니다.
윌리엄 퍼셀

해당 정보에 대한
감사합니다

답변:


4

라인

test -z $LOGNAME || echo Logname is not defined

이다 OR 목록 및로 번역 할 수 있습니다 :

DO echo Logname is not defined IF가 test -z $LOGNAME 하지 못한

귀하의 질문에서 언급했듯이 길이가 0 test -z $LOGNAME인지 아닌지 $LOGNAME테스트합니다. 그렇지 않으므로 테스트에 실패합니다. 교체 ||&&당신이 원하는 행동을 줄 것이다 다음과 같습니다 :

test -z $LOGNAME && echo Logname is not defined

편집 : 아래의 William Pursell의 의견에 따르면 test -n(길이가 아닌 문자열 테스트) ||더 개념적 의미가 있지만 $LOGNAME이 경우 인용해야합니다 (실제로 인용 습관을 얻는 것이 좋습니다) 일반적으로 변수) :

test -n "$LOGNAME" || echo Logname is not defined

고맙습니다. 이전에 -z 옵션의 기능을 이해할 수 없었습니다. 이제 이해했습니다.
DesirePRG

따라서 쉘은 실패에 대해 1을, 성공에 대해 0을 리턴합니다. 우리가 그렇게 생각한다면 다른 언어와는 정반대입니다. 왼쪽 부분이 1로 평가되면 오른쪽 부분을 실행할 필요가 없기 때문에 혼란 스럽다
DesirePRG

1
@DesirePRG 예, 종료 상태 0은 성공을 나타냅니다. 부울 값이 아닙니다. 명령은 0에서 255까지의 종료 상태를 리턴 할 수 있으며, 이는 사용자 / 다른 프로그램에게 어떤 종류의 오류가 발생했는지 알려줍니다 ( "0"은 "오류 없음").

2
인용에주의해야합니다. test -n $foofoo가 정의되지 않은 경우 성공하지만 foo의 길이가 0이 아닌 경우 성공하기 때문에 대기중인 재해입니다. test -z $foo예상대로 작동합니다 (즉, foo정의되지 않은 경우와 foo길이가 0 일 때 성공 ).하지만 test -z "$foo"병리학 적 사례 를 사용 하고 피하는 것이 좋습니다 . ( test -z $foo문자열 -z이 비어 있지 않기 때문에 foo가 정의되지 않은 경우에 성공합니다 .)
William Pursell

@WilliamPursell Good catch-귀하의 의견에 따라 답변에 약간을 추가했습니다.

0

test 명령은 현재 폴더에서 언급 된 파일을 찾습니다. 다른 위치에서 파일을 확인하려면 전체 경로를 제공하고 -z 옵션 또는 -s 옵션을 사용하지 마십시오. 아래와 같이 할 수 있습니다 :

테스트 / usr / bin / logname && echo $ LOGNAME || echo Logname이 정의되지 않았습니다

또는

test -s / usr / bin / logname && echo $ LOGNAME || echo Logname이 정의되지 않았습니다


1
질문을 다시 읽어보십시오 ...

'test -z $ LOGNAME && echo Logname is not defined'가 정확하면 'test -z $ LOGNAME && echo $ LOGNAME || echo Logname is not defined '출력을 수정해야합니다. 어쨌든 당신의 제안에 감사드립니다.

아니요- test -z작동 방식을 이해하지 못합니다 . 직접 해보십시오.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.