[Shell Script] 미정의 변수를 에러 처리

 미정의 변수를 에러 처리 


#!/bin/sh
set -u
COPY_DIR=/myapp/work

#COPY 가 아닌 COP_DIR로 잘못입력 .
cp myapp.log $COP_DIR


이 스크립트는 변수명을 잘못 타이핑해서 미정의 변수를 쓰게 될 때 에러를 표시하는 예제 입니다 . 실행하면 " unbound variable" 이라는 에러 가 표시됩니다 . 








  • 보통 셸 스크립트에서는 선언되지 않은 변수를 사용해도 에러가 발생하지 않습니다 . 
  • 변수 대입은 변수 자체를 선언하지 않아도 가능하고 미정의 변수를 참조하면 빈 문자열이 됩니다 . 
  • 따라서 일일이 변수 선언을 하지 않아도 간단하게 프로그래밍이 가능하다는 점이 셸 스크립트의 장점입니다 

하지만 변수 선언이 필요 없다는 셸 스크립트의 특징은 생각치 못한 버그를 만들 위험이 있습니다 . 
예를 들어 rm 명령어로 삭제할 경로명을 셸 변수로 지정할 때 조심해야 합니다 . 


다음은 셸 변수dirname으로 지정한 /myapp/work/tmpdir 디렉터리를 삭제하는 스크립트입니다 . 

#!/bim/sh

dirname=/myapp/work/tmpdir
rm -rf $dirname

이 스크립트는 만약 $dirname 부분을 실수 해서 $dirnam과같이 작성하면 dirnam은 정의 되지 않았으므로 다음과 같이 실행됩니다 . 

rm -rf /

위 명령은 루트 디렉터리를 지우려는 시도입니다 . 

시스템 전체가 파손되는 중대 문제가 발생합니다 . 








이런 일을 방지 하기위해 #1에서 set 명령어의 -u 옵션을 사용합니다 . set -u 를 지정하면 스크립트 내부에서 미정의 변수를 참조하려고 할 때 에러가 발생하여 셸 스크립트 실행이 중단 됩니다 . 


rm 같은 위험한 동작을 하는 셸 스크립트를 만들때는 set -u를 기본으로 설정해서 변수명이 정의되지 않으면 에러가 발생하도록 합시다 .