10.3. 루프 제어

루프의 동작에 영향을 미치는 명령어들

break, continue

breakcontinue 루프 제어 명령어 [1] 는 다른 프로그래밍 언어들과 정확히 같은 동작을 합니다. break 명령어는 자신이 속해 있는 루프를 끝내고, continue는 해당 루프 사이클 내에 남아 있는 나머지 명령어들을 건너 뛰고 다음 단계의 루프를 수행합니다.

예 10-19. 루프에서 breakcontinue의 영향

#!/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 NN 레벨의 루프를 빠져나갑니다.

예 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]

whilecase키워드인 반면에 breakcontinue는 쉘 내장명령입니다.