[shell script] break, continue

break : break를 읽은 시점에서 바로 break가 속해 있는 반복문을 종료
continue : continue를 읽은 시점에서 그 아래로의 코드는 스킵하고 다음 반복 진행

예를 들어, 0부터 10까지 커지는 인덱스 내에서 인덱스가 5일 때 각각 breakcontinue를 써보면 차이가 극명히 드러납니다.

$ cat test1
#!/bin/bash
for (( i = 0; i <= 10; i++ ))
do
        if (( $i == 5 ))
        then
                break
        fi
        echo "i -> $i"
done

$ ./test1
i -> 0
i -> 1
i -> 2
i -> 3
i -> 4

위와 같이 i = 5일 때 break를 만나면 for문을 아예 종료시켜버립니다.
그래서 4까지만 출력되었습니다.

반면, break 자리에 continue를 사용한다면 어떻게 될까요?

$ cat test1
#!/bin/bash
for (( i = 0; i <= 10; i++ ))
do
        if (( $i == 5 ))
        then
                continue
        fi
        echo "i -> $i"
done

$ ./test1
i -> 0
i -> 1
i -> 2
i -> 3
i -> 4
i -> 6
i -> 7
i -> 8
i -> 9
i -> 10

continue를 사용하면 i = 5일 때 continue를 읽어들이고, 그 아래에 코드를 스킵하고 다음 반복을 진행합니다.
그래서 출력된 결과에는 5를 제외하고 나머지 결과들이 출력되는 것입니다.

이중 for문에서 바깥쪽 루프를 종료 또는 스킵 하는 법

breakbreak가 속해 있는 반복문을 종료합니다.

j = 2일 때, break를 만나면 j를 돌리는 for문이 완전히 종료되어 뒤에 j = 3, 4의 경우를 실행하지 않습니다.

바깥의 i를 돌리는 for문에는 영향이 전혀 없습니다.

$ cat test1
#!/bin/bash
for (( i = 1; i <= 4; i++ ))
do
        echo "i -> $i"
        for (( j = 1; j <= 4; j++ ))
        do
                if (( $j == 2 ))
                then
                        break
                fi
                echo "  j -> $j"
        done
done

$ ./test1
i -> 1
        j -> 1
i -> 2
        j -> 1
i -> 3
        j -> 1
i -> 4
        j -> 1

하지만 여기서 바깥쪽 i를 돌리는 for문을 종료하는 방법이 있습니다.

break n

n의 기본값은 1로 현재 속해 있는 루프를 나타냅니다.
숫자가 하나씩 증가할 때마다 바깥쪽 루프를 가리킵니다.

break 2를 주게 되면 바깥쪽 i를 돌리는 루프가 종료됩니다.

$ cat test1
#!/bin/bash
for (( i = 1; i <= 4; i++ ))
do
        echo "i -> $i"
        for (( j = 1; j <= 4; j++ ))
        do
                if (( $j == 2 ))
                then
                        break 2
                fi
                echo "  j -> $j"
        done
done

$ ./test1
i -> 1
        j -> 1

continuecontinue가 속해 있는 반복문의 내용에서 continue 다음 코드들을 스킵합니다.

j = 2일 때 continue를 만나면 j를 돌리는 for문 안에서 continue 아래의 내용을 생략하고 다음 반복을 진행하는 것을 볼 수 있습니다.

바깥의 i를 돌리는 for문에는 영향이 전혀 없습니다.

$ cat test1
#!/bin/bash
for (( i = 1; i <= 4; i++ ))
do
        echo "i -> $i"
        for (( j = 1; j <= 4; j++ ))
        do
                if (( $j == 2 ))
                then
                        continue
                fi
                echo "  j -> $j"
        done
done

$ ./test1
i -> 1
        j -> 1
        j -> 3
        j -> 4
i -> 2
        j -> 1
        j -> 3
        j -> 4
i -> 3
        j -> 1
        j -> 3
        j -> 4
i -> 4
        j -> 1
        j -> 3
        j -> 4

continue도 마찬가지로 매개변수를 주면 바깥쪽 루프의 내용을 스킵할 수 있습니다.

$ cat test1
#!/bin/bash
for (( i = 1; i <= 4; i++ ))
do
        echo "i -> $i"
        for (( j = 1; j <= 4; j++ ))
        do
                if (( $j == 2 ))
                then
                        continue 2
                fi
                echo "  j -> $j"
        done
done

$ ./test1
i -> 1
        j -> 1
i -> 2
        j -> 1
i -> 3
        j -> 1
i -> 4
        j -> 1

좋은 웹페이지 즐겨찾기