break와 continue 루프 제어 명령어 [1] 는 다른 프로그래밍 언어들과 정확히 같은 동작을 합니다. break 명령어는 자신이 속해 있는 루프를 끝내고, continue는 해당 루프 사이클 내에 남아 있는 나머지 명령어들을 건너 뛰고 다음 단계의 루프를 수행합니다.
예 10-19. 루프에서 break와 continue의 영향
#!/bin/bash LIMIT=19 # 상한선 echo echo "3,11을 제외하고 1부터 20까지 출력." a=0 while [ $a -le "$LIMIT" ] do a=$(($a+1)) if [ "$a" -eq 3 ] || [ "$a" -eq 11 ] # 3,11을 제외 then continue # 이번 루프의 나머지 부분을 건너뜀. fi echo -n "$a " done # 독자들을 위한 연습문제: # 루프가 왜 20까지 찍을까요? echo; echo echo 1부터 20까지 찍지만 2다음에 무슨 일인가가 일어납니다. ################################################################## # 똑같은 루프지만 'continue'를 'break'로 바꿨습니다. a=0 while [ "$a" -le "$LIMIT" ] do a=$(($a+1)) if [ "$a" -gt 2 ] then break # 루프 나머지를 모두 건너뜀. fi echo -n "$a " done echo; echo; echo exit 0 |
break 명령어는 매개변수를 받을 수도 있습니다. 매개변수 없는 break는 자신이 속해 있는 제일 안쪽 루프를 끝내지만, break N은 N 레벨의 루프를 빠져나갑니다.
예 10-20. 여러 단계의 루프에서 탈출하기
#!/bin/bash
# break-levels.sh: 루프에서 탈출하기.
# "break N" 은 N 레벨의 루프를 빠져나갑니다.
for outerloop in 1 2 3 4 5
do
echo -n "$outerloop 그룹: "
for innerloop in 1 2 3 4 5
do
echo -n "$innerloop "
if [ "$innerloop" -eq 3 ]
then
break # break 2 라고 하면 어떻게 될까요?
# (안쪽과 바깥쪽 루프 모두에서 "탈출"(break)합니다.)
fi
done
echo
done
echo
exit 0 |
continue 명령어도 break와 비슷하게 매개변수를 받아 들일수 있습니다. 매개변수 없는 continue는 자신이 속한 루프의 현재 작업을 끝내고 다음번으로 건너 뛰지만 continue N은 자신이 속한 루프 레벨의 모든 단계를 건너 뛰고 N 레벨 위에 속하는 루프의 다음 단계로 건너 뜁니다.
예 10-21. 더 상위 루프 레벨에서 계속하기(continue)
#!/bin/bash
# "continue N" 명령어, N 번째 루프에서 계속하기(continue).
for outer in I II III IV V # 바깥쪽 루프
do
echo; echo -n "Group $outer: "
for inner in 1 2 3 4 5 6 7 8 9 10 # 안쪽 루프
do
if [ "$inner" -eq 7 ]
then
continue 2 # "바깥쪽 루프"인 2번째 레벨의 루프에서 계속 진행합니다.
# 윗줄을 그냥 "continue"라고 하면 보통의 루프 동작이 일어납니다.
fi
echo -n "$inner " # 8 9 10 은 절대 에코되지 않습니다.
done
done
echo; echo
# 독자들을 위한 연습문제:
# "continue N"을 쓰는 쓸모있는 스크립트를 짜 보세요.
exit 0 |
| 경고 |
continue N은 아무리 의미 있는 상황에서 썼더라도 이해하기 어렵고 쓰기 까다롭기 때문에 안 쓰는게 제일 좋습니다. |
| [1] |