왜 [0]이 무한 루프에 들어가나요?


23

with 루프와 같은 루프 아래 동작이 보입니다 while [ 1 ]. 왜 이렇게이다?

while [ 0 ]; do
    echo "hello"
done

답변:


33

쉘의 단일 대괄호는 test(별도의 명령 또는 쉘 내장 )의 동의어 이므로 [ 0 ]와 동일한 의미 test 0입니다. test맨 페이지에서 읽을 수 있듯이 파일 속성을 비교하고 테스트하기위한 것입니다. 비교, 파일 테스트 또는 다른 연산 중 하나처럼 보이는 표현식이 제공되지 않으면 인수가 존재하고 비어 있지 않은 문자열이 있는지 테스트합니다. 테스트에 적합한 입력이 아니 0거나 1실제로 입력되지 않으며 비어 있지 않은 문자열 테스트가 성공하면 while 루프가 영원히 반복됩니다.

대신 시도해 볼 수 있습니다

while false; do
  echo "hello"
done

대체 가능성 false으로 true. 또는 원하는 것은 다음을 사용하는 것입니다 (( )).

while (( 0 )); do
  echo "hello"
done

대부분의 언어처럼 작동하며 0은 실패 / 거짓을 의미하고 1은 성공 / 참을 의미합니다.


1
다시 : "비교, 파일 테스트 또는 다른 작업 중 하나처럼 보이는식이 제공되지 않으면 단순히 성공합니다"라고 생각합니다. 결국 [ ](인수없이) 및 [ "" ](하나의 빈 인수로) 성공 하지 못합니다.
ruakh

3
@ruakh가 설명 했듯이이 문장은 잘못되었습니다. 비교, 파일 테스트 또는 수행 할 수있는 다른 작업 중 하나처럼 보이는 표현식이 제공되지 않으면 단순히 성공합니다. 인수가 빈 문자열이 아닌 경우 테스트에 대한 모든 하나의 인자 (대괄호 내부에 하나의 인자)가 TRUE로 간주되며, 모두 0하고 1빈 문자열이 아니다. 새로운 쉘 프로그래머들은 종종 if [ 1=2 ]대신에 글을 쓰고 if [ 1 = 2 ]왜 전자가 항상 사실인지 궁금합니다. 단일 인수이고 빈 문자열이 아니기 때문에 사실입니다.
Ian D. Allen

좋은 지적, 나는 수정했다.
wingedsubmariner 2009 년

10

여기서 0 값은 숫자 상수가 아니라 문자열로 작동합니다. 이러한 테스트는 모두 성공적인 종료 상태를 생성하는 효과와 동일합니다.

[ A ]
[ "XYZ" ]
[ 0 ]

이들은 실패한 종료 상태를 생성합니다.

[ ]
[ "" ]

공백이 아닌 인수가 있으며 논리 참으로 평가됩니다. 이를 통해 다음과 같은 작업을 수행 할 수 있습니다.

if [ $UNDER_NUCLEAR_ATTACK ] ; then
  launch-missiles -a $DRY_RUN  # $DRY_RUN set to "-n" during testing
fi

변수 UNDER_NUCLEAR_ATTACK는 true를 표시하기 위해 공백이 아닌 값으로 설정되거나, false를 표시하려면 설정되지 않거나 비어 있습니다.

!연산자를 적용 하여 논리를 되돌릴 수 있습니다 .

[ ! a ]  # fails: a is nonblank so true; and not true is false.
[ ! ]    # succeeds: blank is false, not blank is true.

숫자 조건을 평가하려면 숫자 테스트 연산자를 사용해야합니다.

 while [ $A -gt $B ] ; do ...

경우 A와 것은 B진수 정수와 같은 모습은, 그들이 숫자처럼 비교되는 문자열을 포함하고있는 경우는 A보다 큰 B루프가 실행. 따라서 UNDER_NUCLEAR_ATTACK공백이거나 공백이 아닌 문자열 유형의 부울이 아니라 실제로는 0(거짓) 또는 다른 값 (참) 인 숫자 부울입니다 . 이 경우 다음과 같이 테스트를 작성합니다.

 if [ $UNDER_NUCLEAR_ATTACK -ne 0 ] ; then ...

-1

if / then 구문은 명령 목록의 종료 상태가 0인지 (0은 UNIX 규칙에 의해 "성공"을 의미하므로) 테스트하고 있으면 하나 이상의 명령을 실행합니다.

요컨대, 테스트 결과 0을 반환합니다.

http://www.tldp.org/LDP/abs/html/testconstructs.html


5
네,하지만 당신이 생각하는 이유는 아닙니다. [인수를 하나만 얻는 다면 ( ]물론을 제외하고 ) 인수가 비어 있지 않으면 상태 0으로 종료하고, 그렇지 않으면 0이 아닙니다. 예를 들어 [ 1 ]종료 코드도 반환합니다 0.
Kevin

-1

while 루프의 경우 0 값은 true로 간주되므로 while 루프의 조건은 true이므로 무한 루프를 계속 표시합니다. 0을 1로 바꾸면 참이됩니다. 조건 사이에 쓴 정수는 참을 반환합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.