본문 바로가기
Linux/Bash

[Linux] Bash case 조건문 문법

by A6K 2020. 11. 17.

리눅스에서 Base 스크립트를 작성할 때 사용할 수 있는 조건문 중 `case`문이 있다. 마치 Java에서 switch - case문처럼 Base에서도 조건문을 간단하게 사용할 수 있다.

Bash - case문

Base에서 case문은 다음 문법을 따른다.

case 기준문자열 in
  문자열1)
    명령
    명령
    ;;
  문자열2)
    명령
    명령
    ;;
  *)
    명령
    명령
    ;;
esac

기준문자열에 해당하는 값을 '문자열1', '문자열2'와 비교하여 분기한다. 각 분기의 마지막에는 ;;를 찍어서 분기의 종료를 알려줘야한다. *)는 Java의 switch-case 문에서의 default와 같다. '문자열1', '문자열2'와 같지 않은 모든 경우가 이 곳으로 분기한다.

분기의 조건은 OR 조건으로 여러개를 묶을 수도 있다.

case 기준문자열 in
  문자열1|문자열2)
    명령1
    명령2
    ;;
  문자열3|문자열4)
    명령3
    명령4
    ;;
  *)
    명령
    명령
    ;;
esac

기준문자열이 '문자열1'이거나 '문자열2'인 경우에는 명령1과 명령2를 수행한다. 기준문자열이 '문자열3'이거나 '문자열4'인 경우에는 명령3과 명령4를 수행한다.

case문을 이용한 예제를 살펴보자

COUNTRY=korea

case $COUNTRY in
  "korea"|"japan"|"china")
    echo "$COUNTRY is Asia"
    ;;
  "USA"|"Canada"|"Mexico")
    echo "$COUNTRY is Ameria"
    ;;
  * )
    echo "I don't know where is $COUNTRY
    ;;
 esac

Bash - 패턴을 사용한 case문

case문의 강력함은 패턴과 함께 썼을 때 발휘된다.

str="abc"

case $str in
  a*)
    echo "$str starts with a"
    ;;
  a?)
    echo "$str starts with a and has two words"
    ;;
  a[bc])
    echo "$str starts with a and then followed by b or c "
    ;;
  * )
    echo "I don't know where is $COUNTRY"
    ;;
 esac

bash의 case문은 glob 패턴을 따른다. 쉘 환경에서 파일 이름을 와일드카드 문자로 다룰 때 사용하는 패턴이다.

와일드카드 설명
* 없는 것을 포함한 어떠한 개수의 문자라도 일치
? 임의의 하나의 문자가 일치
[abc] 대괄호 안의 하나의 문자가 일치
[a-z] 대괄호 안의 범위에 속하는 하나의 문자가 일치

case문에서 *) 조건이 나머지 모두를 의미하는 이유가 바로 여기에 있다.

댓글