Development/Bash Shell script

[BASH Shell] case 문( 활용 포함)

louky 2022. 4. 5. 14:53
반응형

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문은 추천 드립니다. 

반응형