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