셸의 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처럼 구문 오류임을 알리는 값을 반환해. 그러면 사람과 호출 스크립트가 같은 계약을 읽을 수 있어.