2016-10-28 2 views
0

를 종료 없지만 나는이 작동하지 않습니다 다음Bash 스크립트. 정수 비교와 루프가 결코

을 입증하기 위해 다음과 같은 최소한의 예를 작성했습니다 :

#! /bin/bash 

n=1 m=2 

while ((n < m)) 
    echo "$n $m" 
    ((n=n+1)) 
do 
    continue 
done 

않습니다 다음 작업 : 이해

#! /bin/bash 

n=1 m=2 

while true 
    echo "$n $m" 
    ((n=n+1)) 
do 
    if ((n < m)) 
    then 
     continue 
    else 
     break 
    fi 
done 

왜 두 번째 형식이 작동하는지. 왜 첫 번째 양식이 작동하지 않는지 나는 이해할 수 없다.

나는이 스크립트들이 동등하다고 생각한다고 썼다. (동일한 출력을 생성합니다.) 그러나 첫 번째 무한 루프! 왜 이런 일이 생길까요?

답변

3

첫째, 문서 얼핏 :

$ help while 
while: while COMMANDS; do COMMANDS; done 
    Expand and execute COMMANDS as long as the final command in the 
    `while' COMMANDS has an exit status of zero. 

참고 정확한 텍스트 : while 명령에서 마지막 명령 누구의 종료 상태 카운트 하나입니다. 우리는 나중에 그것으로 돌아갈 것이다. 원래 코드에서


:

while ((n < m)) 
    echo "$n $m" 
    ((n=n+1)) 
do 
    continue 
done 

... 당신이 ((n < m))이 조건으로 사실 여부를 확인하지 않습니다; 대신, ((n = n + 1))이 맞는지 확인하고 있습니다. do 전에 모든 것이 루프를 계속 실행할지 여부를 결정하는 조건을 형성하도록 구성되어 있기 때문에

사실이며, 종료 줄 바꿈으로 구분 된 일련의 명령의 상태 나 ;들의 종료 상태 그 시리즈의 마지막 명령. ((n = n + 1))이 사실이 아닐 경우 (정수로 강제 변환되거나 오류가 발생하지 않는 내용이 없다고 가정)는 초기 값이 0보다 작고 결과가 0 이하인 경우입니다. 당신이 정말로 모든 명령은 당신의 상태 안에 싶은 경우

대신 쓸 수있다 :

while ((n < m)) && echo "$n $m" && ((n = n + 1)); do :; done 

을 ... 비교가있는 경우 다소 다른 행동을 가지고 물론 ('echo'ing 아니지만 실패한).


대신 고려 :

while ((n < m)); do 
    echo "$n $m" 
    ((n++)) 
done 
+0

배쉬의 광기 - 덕분에이 멋지게 일을 정리! – user3728501

+0

@ user3728501,'while (n

+0

반드시 좋거나 나쁜 언어 디자인이 아닙니다. 방금 구문을 이해하지 못했습니다. 구문 오해! = 엉뚱한 코딩. – user3728501

관련 문제