반달가면 이글루에서 백업 - 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 변수를 설정.
다양한 옵션을 지정해야 하는 스크립트를 만들 때 요긴하다.
'bash script' 카테고리의 다른 글
[bash: awk] awk에서 출력할 위치(필드)를 변수로 지정하기 (0) | 2023.04.17 |
---|---|
[bash: readlink] 상대경로를 절대경로로 바꾸기 (0) | 2023.04.17 |
[bash: tr, sed] txt 파일에서 여러줄로 된 항목을 한줄로 바꾸기 - 2 (2) | 2023.04.13 |
리눅스 bash 스크립트에서 배열(array) 사용하기 (0) | 2023.04.11 |
[bash: ",'] 따옴표 선택/사용하기 (0) | 2023.04.11 |