본문 바로가기
C.W.K.
Stream
Lesson 05 of 12 · published

Case 문

~8 min · case, switch

Level 0창 구경꾼
0 XP0/95 lessons0/14 achievements
0/100 XP to next level100 XP to go0% complete

셸의 switch

case "$1" in
  start)   ./serve.sh & ;;
  stop)    pkill -f serve.sh ;;
  status)  pgrep -fa serve.sh ;;
  *)       echo "usage: $0 {start|stop|status}"; exit 2 ;;
esac

각 가지는 ;;로 끝나. 패턴은 글로브 문법을 쓰며 위에서부터 처음 맞는 가지 하나가 실행돼. 마지막 *)는 알 수 없는 입력을 받는 기본 경로야.

가지마다 패턴 여러 개

case "$ext" in
  jpg|jpeg|png|gif|webp) echo image ;;
  mp4|mov|webm)          echo video ;;
  *.bak|*~|*.tmp)        echo trash ;;
  *)                     echo other ;;
esac

이어 실행 (bash 4+, zsh)

;;&로 끝내면 다음 패턴들도 계속 테스트. ;& 면 다음 가지의 본문으로 이어 실행. 자주 쓰지는 않지만 다음 가지의 동작을 이어야 할 때 쓸 수 있어.

case가 if를 이기는 때

같은 문자열을 여러 값과 비교하는 elif가 길어지면 case가 구조를 더 잘 보여 줘. CLI의 start|stop|status|reload 같은 하위 명령 분기에 특히 잘 맞아. 속도보다 중요한 장점은 허용한 입력과 거부 경로가 한눈에 보인다는 점이야.

패턴은 정규식이 아니야

case의 패턴은 셸 글로브이므로 정규식의 +나 괄호 의미를 그대로 기대하면 안 돼. 여러 값은 jpg|jpeg|png처럼 세로줄로 묶고, 더 복잡한 검증이 필요하면 그 가지 안에서 별도 명령을 실행해.

분기 안에 위험한 동작을 숨기지 마

예제의 pkill -f처럼 넓게 매치하는 명령은 이름이 비슷한 다른 프로세스까지 건드릴 수 있어. 실제 서비스 제어 스크립트라면 PID 파일, 서비스 매니저, 정확한 식별자를 사용해. case는 입력을 나누는 도구지 대상 확인을 대신해 주지는 않아.

기본 경로가 인터페이스를 완성해

알 수 없는 입력을 조용히 무시하면 자동화가 성공한 것처럼 보일 수 있어. 사용법을 표준 오류에 보여 주고 종료 상태 2처럼 구문 오류임을 알리는 값을 반환해. 그러면 사람과 호출 스크립트가 같은 계약을 읽을 수 있어.

Code

서비스 스타일 분기·bash
#!/usr/bin/env bash
set -euo pipefail
case "${1:-}" in
  up)    docker compose up -d ;;
  down)  docker compose down ;;
  logs)  docker compose logs -f "${2:-}" ;;
  '')    echo 'usage: dev {up|down|logs}' >&2; exit 2 ;;
  *)     echo "unknown subcommand: $1" >&2; exit 2 ;;
esac

External links

Exercise

categorize.sh path가 확장자에 따라 이미지, 비디오, 압축 파일, 소스와 기타 범주를 출력하게 case로 작성해. 서로 다른 시험 파일과 확장자가 없는 파일을 넘기고, 알 수 없는 값이 기본 분기에서 처리되는지 확인해.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.