CASE 문

Bash 스크립팅 입문

Alex Scriven

Data Scientist

CASE 문이 필요한 이유

여러 개 또는 복잡한 조건이 있으면 CASE 문이 IF 문보다 더 효율적일 수 있습니다.

다음 조건과 동작을 검사한다고 가정해 보겠습니다:

  • 파일에 sydney가 있으면 /sydney 디렉터리로 이동
  • 파일에 melbourne 또는 brisbane가 있으면 삭제
  • 파일에 canberra가 있으면 원래 파일명을 filename이라 할 때 IMPORTANT_filename으로 이름 변경
Bash 스크립팅 입문

복잡한 IF 문

다음과 같이 여러 IF 문을 만들 수 있습니다:

  • 이 코드는 조건을 위해 첫 번째 ARGV 인수에 대해 grep을 호출합니다.
if grep -q 'sydney' $1; then
    mv $1 sydney/
fi
if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi
if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi
  • 복잡하고 반복적이지 않나요?
Bash 스크립팅 입문

CASE 문 작성하기

  • 먼저 어떤 변수나 문자열을 기준으로 매칭할지 선택합니다
    • 여기서 셸 안의 셸을 호출할 수도 있습니다!
  • 가능한 패턴과 동작을 원하는 만큼 추가합니다.
    • PATTERN에는 정규식 사용 가능. 예: 시작이 Air이면 Air*, hat를 포함하면 *hat*
  • 패턴과 실행 코드 사이를 닫는 괄호로 구분하고, 명령은 이중 세미콜론으로 끝냅니다

기본 CASE 문 형식:

case 'STRINGVAR' in

PATTERN1) COMMAND1;; PATTERN2) COMMAND2;;
Bash 스크립팅 입문

CASE 문 작성하기

 

  • *) DEFAULT COMMAND;;

    • 다른 패턴이 모두 불일치일 때 실행되는 기본 명령으로 마무리하는 것이 일반적입니다(필수는 아님).
  • esac 마지막 마무리 키워드는 'esac'입니다

    • 'case'를 거꾸로 쓴 것입니다!

기본 CASE 문 형식:

case 'STRING' in
  PATTERN1)
  COMMAND1;;
  PATTERN2)
  COMMAND2;;

*) DEFAULT COMMAND;;
esac
Bash 스크립팅 입문

IF에서 CASE로

이전 IF 문:

if grep -q 'sydney' $1; then
    mv $1 sydney/
fi

if grep -q 'melbourne|brisbane' $1; then
    rm $1
fi

if grep -q 'canberra' $1; then
    mv $1 "IMPORTANT_$1"
fi

새로운 CASE 문:

case $(cat $1) in

*sydney*) mv $1 sydney/ ;; *melbourne*|*brisbane*) rm $1 ;; *canberra*) mv $1 "IMPORTANT_$1" ;;
*) echo "No cities found" ;; esac
Bash 스크립팅 입문

연습해 봅시다!

Bash 스크립팅 입문

Preparing Video For Download...