bash script2023. 4. 17. 16:36

반달가면 이글루에서 백업 - http://bahndal.egloos.com/552036

 

case 명령을 활용하면 스크립트를 실행할 때 인자(argument)를 좀 더 유연하게 지정할 수 있다. 일단 기본적인 인자 처리의 예시를 본 후 case 명령을 사용하는 경우를 살펴보자.

특정 파일을 특정 디렉토리로 옮기는 기능을 스크립트로 만든다고 가정해 보자. 파일명은 mov_file.sh다. 그냥 쉽게 만들면 아래와 같이 만들 수 있을 것이다.

# mov_file.sh
# 사용법: ./mov_file.sh [파일] [디렉토리]
mv "$1" "$2"

그냥 mv 명령 하나면 되므로 사실 위의 스크립트 자체는 의미가 없다. 그러나, 인자가 너댓개씩 들어가거나 인자에 따라 다양한 기능을 수행하는 복잡한 스크립트를 만들 경우에는 얘기가 달라진다. 이 경우, 편의성 측면에서 볼 때 인자의 순서를 기억하는 것보다 옵션을 지정하도록 만드는 것이 더 좋다. 예를 들어 -f 옵션으로 파일을 지정하고 -d 옵션으로 디렉토리를 지정하는 식이다. 이렇게 하면 인자의 순서가 바뀌어도 무관하므로 편리하다. 대신 스크립트는 좀 복잡해지는데, 인자 처리를 위해 배열(array)과 case 구문을 사용해야 한다.

아래의 예시를 보자.

# mov_file.sh
# 사용법: ./mov_file.sh -f [파일] -d [디렉토리] 
#    ./mov_file.sh -d [디렉토리] -f [파일] 이렇게 실행해도 결과는 동일하다.
# 기본값 설정
file_name="default"
dir_name="default"
# 실행 명령을 단어별로 구분하여 arg_array 배열에 저장
arg_array=(`echo "$0 $*"`)
# 인자(argument) 처리
for arg_num in `seq 1 $#`
do
  # 현재 인자의 값
  arg_val=${arg_array[$arg_num]}
  # 다음 인자의 배열 번호(index)
  next_arg_num=`expr $arg_num + 1`
  # 다음 인자의 값
  next_arg_val=${arg_array[$next_arg_num]}
  # case 구문을 이용한 인자 해석
  case $arg_val in
    -f) file_name="$next_arg_val"
        ;;
    -d) dir_name="$next_arg_val"
        ;;
    *) continue
       ;;
  esac
done
# 파일 이동
mv "$file_name" "$dir_name"

스크립트를 실행하면 실행 명령 전체를 단어별로 배열 arg_array에 저장을 했다. 그리고 for 반복문으로 인자를 하나씩 가져와서 case 구문으로 해석을 하는 식이다. 만약 인자가 -f라면 그 다음 인자를 파일명으로 간주하여 file_name 변수를 설정하고, -d라면 그 다음 인자를 디렉토리명으로 간주하여 dir_name 변수를 설정.

다양한 옵션을 지정해야 하는 스크립트를 만들 때 요긴하다. 

728x90
Posted by 반달가면