[bash: for, case] 인자(argument) 처리 리눅스 bash script

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 변수를 설정.

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

배열 사용에 대한 내용은 이전 게시물을 참고하자. 여기로

for 반복문에서 사용된 seq 명령에 대한 게시물은 여기로



덧글

댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.

Google Analytics


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

35736
3890
2062941

adsense(w160_h600)_3

2019 대표이글루_IT