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

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

while [ 0 ]; do
    echo "hello"
done



답변

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

대신 시도해 볼 수 있습니다

while false; do
  echo "hello"
done

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

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

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


답변

여기서 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 ...


답변

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

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

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


답변

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


답변