Bash script 작성시 if문 다음으로 유용하게 사용할 수 있는 조건문 중 case문이 있다.
다른 script 언어에는 없는 조건문으로 bash를 작성하다보면 유용하게 사용할 수 있는 조건문 중 하나이다.
case 기본 문법
# case 기분문법
case 조건_문자열 in
조건_문자열1)
조건_문자열 1에 맞는 명령어
;;
조건_문자열2)
조건_문자열 2에 맞는 명령어
;;
* )
조건_문자열1 or 조건_문자열2에 안맞을 경우 명령어
;;
easc
꼭 case로 시작해서 esac로 닫아야 한다.
"조건_문자열"에는 숫자, 문자등이 올수 있으며 문자열1, 문자열2 등과 같이 비교 문자열을 두어 비교한뒤 분기하도록 처리 한다.
아스테리크 "*" 의 경우 비교 문자열중에하나라도 맞지 않을때에 대한 분기 명령어이며 Default처럼 정의해도 되고 생략해도 된다.
분기별 끝 또는 다음 라인에는 ";;" 을 입력하여 해당 분기가 종료 됨을 알려줘야 한다.
예제) 변수 a에 대한 case분으로 출력은 "a"가 출력된다.
# 문자열
a="abc"
case $a in
a )
echo "a"
;;
b)
echo "b"
;;
*)
echo "all"
;;
esac
# 숫자도 상관없다.
a=1
case $a in
1)
echo "1"
;;
2)
echo "2"
;;
3)
echo "3"
;;
*)
echo "all"
;;
esac
패턴을 이용한 case문
case을 사용하다가 정규식을 이용한 패턴으로 분기를 해야 하는 경우도 있습니다.
아래 방법은 패턴을 이용한 case문 처리 방법입니다.
구분 | 설명 |
* (아스테리크) | 어느 문자열이든 숫자든 몇개의 갯수든 상관없이 일치 |
? | 하나의 문자열만 상관없이 매치 |
[A-Z] | 대문자 중 하나라도 일치 |
[a-z] | 소문자 중 하나라도 일치 |
[abZ] | 대괄호 안에 문자열 하나라도 일치 |
[0-9] | 숫자 중 하나라도 매치 |
a="abc"
case $a in
[a-z]) # 변수 a가 하나의 문자열일때만 일치
echo "$a"
;;
[a-z]*) # 변수 a가 대괄호 안의 문자열중 하나라도 일치하며 시작 할때
echo "start ~~"
;;
*[a-z]) # 변수 a가 대괄호 안의 문자열중 하나로 끝날때
echo "~~ end match"
;;
* ) # 위 조건문자열에 일치 하지 않을때 여기서 일치
echo "all - $a"
;;
esac
응용 - 활용!!!
보통 사용자의 입력을 받고자 할때 유용하게 사용된다.
# 예를 들어 사용자 입력이 Y 또는 N 일때 대문자임에도 불구하고
# 소문자를 입력했을때 아래와 같이 패턴으로 일치 시켜 분기를 처리 할 수 있다.
echo -n "continue? (Y/N)" # 여기서 사용자가 소문자를 입력할 경우
read ans_continue
case $ans_continue in
[Yy] )
echo "yes"
;;
[Nn] )
echo "no"
;;
* )
echo "input Y or N"
;;
esac
활용한 것을 if-else로 바꾼다면 아래와 같다.
echo -n "continue? (Y/N)" # 여기서 사용자가 소문자를 입력할 경우
read ans_continue
if [[ ${ans_continue} =~ [Yy] ]] ; then
echo "yes"
elif [[ ${ans_continue} =~ [Nn] ]] ; then
echo "no"
else
echo "input Y or N"
fi
예제)
echo -n "continue? (Y/N)" # 여기서 사용자가 y/n이 아닌 yes/no로 입력을 할 경우
read ans_continue
case $ans_continue in
[Yy]| [Yy][Ee][Ss] ) echo "yes" ;; # 한줄로도 작성이 가능하다.
[Nn]| [Nn][Oo] ) echo "no" ;;
* ) echo "input Y or N" ;;
esac
echo -n "continue? (Y/N)" # 여기서 사용자가 y/n이 아닌 yes/no로 입력을 할 경우
read ans_continue
if [[ $ans_continue =~ [Yy] ]] || [[ $ans_continue =~ [Yy][Ee][Ss] ]] ; then
echo "yes"
elif [[ $ans_continue =~ [Nn] ]] || [[ $ans_continue =~ [Nn][Oo] ]] ; then
echo "no"
else
echo "input Y or N"
fi
case문과 if문을 비교하면 or조건이 없을 경우에는 if문이 조금더 간결해 보인다.
하지만 or조건이 들어 갈 경우에는 case문이 조금더 간결해 보일수 있다.
이처럼 case문은 if-else 처럼 동작하기에 기본 문법만 알면 손쉽게 사용할 수 있습니다.
하지만, case문은 python이나 다른 script언어에서는 사용할 수가 없다는 단점도 있기에
주로 Bash shellscript를 사용하는 분이라면 case를 사용해도 무방하지만 bash뿐만 아니라 python, golang, perl등도 같이 사용하시는 분이라면 if-else문은 추천 드립니다.
'Development > Bash Shell script' 카테고리의 다른 글
[BASH Shell] Shell script사용자 입력 받기 - backspace 키 사용하기 (0) | 2022.04.06 |
---|---|
[BASH Shell] shell script 사용자 입력 받기 (input user keyboard) (0) | 2022.01.11 |
[BASH Shell] shell script 주석(한줄 주석/여러줄(블럭단위) 주석) (0) | 2019.05.03 |
[BASH Shell ] 숫자 자릿수 0으로 채우기(00, 01, 02 ....) (0) | 2018.09.28 |
[BASH Shell ] 문자열 길이 구하기 (0) | 2018.09.18 |