case 문
on ShellScript
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 같은 논리연산자들도 같이 이용할 수 있다!