[bash] 명령행 옵션 처리하기
Posted 2007/05/18 02:50- args가 생략되면 기본적으로 위치매개변수(positional parameters)를 해석한다.
- optstring은 옵션 문자들(-o 형식에서 o)로 구성된(나열된) 문자열이다.
- 옵션 문자 뒤에 colon(:)이 붙으면 그 옵션은 option's argument를 갖는 것으로 해석한다.
- 파싱한 옵션 문자를 name 변수에 저장하고, 다음 해석을 위해 OPTIND 변수(초기값 1)를 증가시킨다. 즉, OPTIND는 다음에 해석할 매개변수의 인덱스를 의미한다.
- option's argument를 가지는 옵션의 경우에, 그 값을 OPTARG 변수에 저장한다.
- 옵션 해석이 모두 끝나고 옵션이 아닌 매개변수를 만나면 greater-than-zero(false) 값을 리턴한다. 이 때 OPTIND 변수는 옵션이 아닌 첫번째 매개변수를 가리키는 값이 될 것이고, name 변수는 ?로 설정된다.
- 잘못된 옵션을 만나면 name 변수의 값은 ?로 설정하며, 에러메시지를 출력하고 OPTARG 변수를 unset한다. 한편, OPTERR 변수 값을 0으로 설정하거나, optstring 문자열의 첫번째 문자를 colon(:)으로 하면 에러메시지 출력을 막을 수 있다. 이를 silent error reporting이라 하며, 이 경우 잘못된 옵션 문자가 OPTARG 변수에 저장된다.
<예제 소스>
usage="usage: $0 [-a] [-b optarg] [-c] args..."
while getopts ":ab:c" opt ; do
case $opt in
a ) echo "process -a option" ;;
b ) echo "process -b option with optarg=$OPTARG" ;;
c ) echo "process -c option" ;;
? ) echo $usage; exit 1
esac
done
echo "total arguments = $*"
shift $(( $OPTIND - 1 ))
echo "real arguments = $*"
<실행 결과>
process -a option
process -b option with optarg=barg
process -c option
total arguments = -a -b barg -c realarg
real arguments = realarg