앞서
getopt
를 이용한 옵션 기능 구현 방법에 대해 알아보았습니다.
이번에는getopts
를 이용하는 방법에 대해 알아봅시다.
getopts
는 getopt
와 사용 형식이 약간 다릅니다.
getopts optstring variable
getopts는 커맨드라인의 매개변수를 차례대로 variable
에 담아 처리합니다.
따라서 반복문을 이용해 $variable
을 통해 매개변수를 하나씩 조회할 수 있습니다.
참고
유효하지 않은 옵션에 대해 에러 메시지를 표시하지 않으려면optstring
의 첫 시작에:
를 붙여줍니다.
$OPTARG
라는 환경변수는 옵션 뒤의 매개변수를 담고 있습니다.
$ cat test1
#!/bin/bash
while getopts ab:cd opt
do
case $opt in
a) echo "Found the option -a";;
b) echo "Found the option -b, parameter $OPTARG";;
c) echo "Found the option -c";;
d) echo "Found the option -d";;
*) echo "$opt is not the option";;
esac
done
$ ./test1 -ab test1 -c
Found the option -a
Found the option -b, parameter test1
Found the option -c
getopts
는 위의 결과값에서 보시는 바와 같이 큰따옴표를 이용해 파라미터에 빈 칸을 표현할 수도 있고, 옵션과 띄어쓰기를 하지 않아도 자동으로 옵션과 파라미터를 분리해서 인식합니다.
$ ./test1 -b "test1 test2" -c
Found the option -b, parameter test1 test2
Found the option -c
$ ./test1 -btest1 -c
Found the option -b, parameter test1
Found the option -c
알 수 없는 옵션에 대해서는 ?
로 바꾸어 표현하는 모습을 볼 수 있습니다.
$ ./test1 -b test1 -e
Found the option -b, parameter test1
./test1: illegal option -- e
? is not the option
환경 변수 $OPTIND
는 getopt
로 치면 --
이전과 이후의 부분을 나누는 역할을 합니다.
커맨드라인 파라미터에서 옵션이 끝나고 이후에 파라미터만 계속해서 나올 때 파라미터의 시작 위치를 $OPTIND
에 저장합니다.
$ cat test1
#!/bin/bash
while getopts ab:cd opt
do
case $opt in
a) echo "Found the option -a";;
b) echo "Found the option -b, parameter $OPTARG";;
c) echo "Found the option -c";;
d) echo "Found the option -d";;
*) echo "$opt is not the option";;
esac
done
echo $OPTIND
$ ./test1 -b test1 -d test2 test3
Found the option -b, parameter test1
Found the option -d
4
위 파라미터 입력에 대한 결과값에서 $OPTIND
는 4
로 나타납니다.
-d
옵션이 끝나고 test2 test3
로 이어지는 파라미터 구간이 나타나는데 이 첫 위치인 test2
의 위치를 가리키는 것입니다.
그럼 여기서 shift
를 이용하면 뒤의 test2 test3
파라미터 구간을 다룰 수 있게 됩니다.
$ cat test1
#!/bin/bash
while getopts ab:cd opt
do
case $opt in
a) echo "Found the option -a";;
b) echo "Found the option -b, parameter $OPTARG";;
c) echo "Found the option -c";;
d) echo "Found the option -d";;
*) echo "$opt is not the option";;
esac
done
shift $[ $OPTIND - 1 ]
count=1
for param in "$@"
do
echo "parameter #$count: $param"
count=$[ $count + 1 ]
done
$ ./test1 -b test1 -d test2 test3
Found the option -b, parameter test1
Found the option -d
parameter #1: test2
parameter #2: test3
$OPTIND - 1
만큼 shift
를 해주어 이후에는 파라미터 구간만 다루게 됩니다.