Profile picture

[Shell Script] case 조건문 활용 방법

JaehyoJJAng2024년 01월 05일

▶︎ case 문

case는 영어 뜻 그대로 특정한 상황의 경우를 의미한다.

if문을 이용하여 여러 가지의 조건을 걸수도 있지만,

스크립트 내용이 길어질 뿐만 아니라 코드 수행 시간이 의도치 않게 길어질 수도 있다.

case 문은 여러 개의 조건을 다루는데 유용하고, 코드를 보다 간결하고 가독성 있게 만들어준다.

예를 들어, 사용자 입력에 따라 다른 작업을 수행하는 스크립트를 작성해야 할 때에 case문을 도입해볼 수 있다.

아래 예제는 사용자가 입력한 값을 확인하고 각 입력 값에 따라 다른 동작을 수행하는 로직이다.
{% include codeHeader.html name="case_practice.sh" %}

#!/usr/bin/bash

echo "Enter a your name"
read name

case "$name" in
  james)
    echo "your name is james"
    ;;
  john)
    echo "your name is john"
    ;;
  *)
    echo "Sorry, I don't know that name"
    ;;
esac

‣ 문법

case expression in
  pattern1)
    statements
    ;;
  pattern2)
    statements
    ;;
esac

case문의 시작은 case {변수} in으로 시작하고

case문 종료는 easc으로 case를 거꾸로 작성하여 종료한다.

expressions에 변수에 따라 pattern1과 pattern2가 같으면 각 stattements의 명령어를 실행하고

statements의 명령줄 종료는 세미콜론(;)으로 종료한다.


‣ 예시

{% include codeHeader.html name="case_example1.sh" %}

#!/usr/bin/bash

A="apple"

case "$A" in
  apple)
    echo "This is apple"
    ;;
  banana)
    echo "This is banana"
    ;;
esac

‣ 응용 문법

• 파이프, 와일드카드

  • 파이프와 와일드카드를 사용한 예제

{% include codeHeader.html name="pipe_and_wildcard.sh" %}

#!/usr/bin/bash

A="melon"

case "$A" in
  apple | banana)
    echo "this is fruit"
    ;;
  carror | cabbage)
    echo "this is vegetable"
    ;;
  *)
    echo "I don't know"
    ;;
esac

위 예시에서는 pattern에 파이프(|)를 사용해 2개의 패턴을 사용하였다.

패턴은 꼭 한개가 아니어도 되며, 여러 개의 패턴을 사용할 때는 파이프를 이용해 구분하고 그 중 하나와 일치하면 된다.

또한 3번쨰 패턴 *)의 의미는 apple, banana, carrot, cabbage의 패턴이 아닌 모든 값이 이 3번째 패턴으로 넘어가게 된다.


• 위치 매개변수

image
위 사진처럼 위치 매개변수로 case문을 활용할 수 있다.

스크립트명은 $0을 나타내고

나머지 $1, $2, $3 ...은 계속 올 수 있는데 이것을 $#으로 정의할 수 있다.

아래 예제는 A변수에 $1 즉, 첫 번쨰 매개변수의 값에 따라 작동하는 case문의 코드이다.
{% include codeHeader.html name="positional_parameter.sh" %}

#!/usr/bin/bash

A="$1"

case "$A" in
  apple | banana)
    echo "fruit"
    ;;
  carrot | cabbage)
    echo "vegetable"
    ;;
  *)
    echo "unknown"
    ;;
esac

위치 매개변수를 활용한 디스코드 webhook 메시지 보내기

{% include codeHeader.html name="sendDiscordMessage.sh" %}

#!/usr/bin/bash

message=''
DISCORD_WEBHOOK_URI='<webhook URI>'

while [[ $# -gt 0 ]]; do
  case "$1" in
    -m | --message)
      message="$2"
      shift 2
      ;;
    *)
      echo "Unknown argument: $1"
      exit 1
      ;;
  esac
done

curl \
    -H "Content-Type: application/json" \
    -d "{\"content\": \"$message\"}" \
    "$DISCORD_WEBHOOK_URI"

파이썬 Streamlit 애플리케이션 실행하기

{% include codeHeader.html name="streamlit-start.sh" %}

#!/usr/bin/bash

scriptPath="$(pwd)/dev/bin/activate"
fileName=''

source "$scriptPath"

while [[ $# -gt 0 ]]; do
    case "$1" in
        -f | --file)
            fileName="$2"
            shift 2
            ;;
        *)
            echo "Unknown argument: $1"
            exit 1
            ;;
        esac
done

if [[ -n "$fileName" ]]; then
    echo -e "starting $fileName ...\n"
    $(which streamlit) run "$fileName"
fi

Loading script...