아래 루프가 의 루프와 동일한 동작을 하는 것을 확인했습니다 while [ 1 ]
. 왜 이런 일이 발생합니까?
while [ 0 ]; do
echo "hello"
done
답변1
쉘에 있는 단일 대괄호는 test
(독립 실행형 명령 또는 쉘 내장 명령)의 동의어이므로 [ 0 ]
동일한 의미를 갖습니다 test 0
. test
맨페이지에서 읽을 수 있듯이 파일 비교 및 테스트를 위한 속성입니다. 비교, 파일 테스트 또는 수행할 수 있는 다른 작업 중 하나처럼 보이는 표현식이 제공되지 않으면 인수가 존재하고 비어 있지 않은 문자열인지 테스트합니다. 0
또는 1
실제로 테스트에 적합한 입력이 아니며, 비어 있지 않은 문자열이므로 테스트는 성공하고 while 루프는 영원히 반복됩니다.
당신은 시도하고 싶을 수도 있습니다
while false; do
echo "hello"
done
또는 다음을 사용하는 것일 false
수도 있습니다 .true
(( ))
while (( 0 )); do
echo "hello"
done
0은 실패/오류를 의미하고 1은 성공/올바름을 의미하는 대부분의 언어처럼 작동합니다.
답변2
여기서 값 0은 숫자 상수가 아닌 문자열로 사용됩니다. 이러한 테스트는 모두 성공적인 종료 상태를 생성하는 데 동일한 효과를 갖습니다.
[ A ]
[ "XYZ" ]
[ 0 ]
이는 실패한 종료 상태를 생성합니다.
[ ]
[ "" ]
논리적인 true로 평가되는 null이 아닌 매개변수가 있습니다. 이를 통해 다음을 수행할 수 있습니다.
if [ $UNDER_NUCLEAR_ATTACK ] ; then
launch-missiles -a $DRY_RUN # $DRY_RUN set to "-n" during testing
fi
이 변수는 UNDER_NUCLEAR_ATTACK
true를 나타내기 위해 null이 아닌 값으로 설정되거나 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
(false) 또는 다른 것 (true)입니다. 이 경우 다음과 같이 테스트를 작성합니다.
if [ $UNDER_NUCLEAR_ATTACK -ne 0 ] ; then ...
답변3
if/then 구조는 일련의 명령의 종료 상태가 0인지 테스트하고(0은 UNIX 규칙에서 "성공"을 의미하기 때문), 그렇다면 하나 이상의 명령을 실행합니다.
즉, 0개의 테스트 결과를 반환하는 것입니다.
답변4
while 루프의 경우 값이 0이면 true로 간주되므로 while 루프의 조건이 true이므로 계속해서 무한 루프를 표시합니다. 조건 사이에 쓰는 모든 정수가 true를 반환하기 때문에 0을 1로 바꾸면 true입니다.