case 문

switch-case 문에 대한 기본적인 구조는 아래와 같으며, 상황에 따라 expression 에 들어갈 패턴들을 여러개 더 추가할 수 있다.

case 문자열/변수 in
    expression)
        statement
        ;;
    expression)
        statement;;
    *)
        statement;;
esac

일반적인 프로그래밍 언어들에서의 사용법과 비슷하며, *이 default 역할을 하고 있다.

;; 를 사용함으로써 특정 expression 에서의 처리를 끝마침을 알려주고, 처리가 끝날 경우에는 따로 break 같은 것이 없더라도 다른 조건들을 검사하지 않는다.


이러한 case 문은, 넣어준 파라미터에 따라 다른 실행을 시킬 때 유용하게 쓸 수 있다.

예를 들어 bash service.sh start, bash service.sh stop처럼 특정 서비스에 대한 처리를 파라미터로 넘겨줄 때, 이를 case 문으로 만들어서 사용하는 편이다.

#!/bin/bash

case $1 in
    start)
        echo starting service...
        echo service started!;;
    stop)
        echo stopping service...
        echo service stopped!;;
    restart)
        echo restarting service...
        echo service restarted!;;
    *)
        echo './service.sh {start|stop|restart}';;
esac

이를 if-elif-else 문으로 처리하려면 매 분기마다 test문([ ])을 써줘야하기 때문에 번거로워진다.


위에처럼 검사하려는 대상과 expression 부분에 들어간 문자열이 같아야만 동작하는 것이 아니라, glob 패턴에 맞출 수도 있다.

#!/bin/bash

date=$(date '+%Y%m%d')

case ${date} in
    ????01?? | ????02?? | ????03??)
        echo 1분기
        ;;
    ????04?? | ????05?? | ????06??)
        echo 2분기
        ;;
    ????07?? | ????08?? | ????09??)
        echo 3분기
        ;;
    *)
        echo 4분기
        ;;
esac

글로빙에서 ? 는 하나의 문자랑 일치시키기 때문에, date 를 20220111 의 형태로 읽어온 뒤, 월 부분과 매칭시켜 분기를 출력하는 것이다.

and 나 or 같은 논리연산자들도 같이 이용할 수 있다!