[shell script] getopts를 이용한 옵션 기능 구현하기

HYEOB KIM·2022년 4월 25일
0

Shell

목록 보기
42/71

앞서 getopt를 이용한 옵션 기능 구현 방법에 대해 알아보았습니다.
이번에는 getopts를 이용하는 방법에 대해 알아봅시다.

getopts

getoptsgetopt와 사용 형식이 약간 다릅니다.

getopts optstring variable

getopts는 커맨드라인의 매개변수를 차례대로 variable에 담아 처리합니다.
따라서 반복문을 이용해 $variable을 통해 매개변수를 하나씩 조회할 수 있습니다.

참고
유효하지 않은 옵션에 대해 에러 메시지를 표시하지 않으려면 optstring의 첫 시작에 :를 붙여줍니다.


$OPTARG

$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

환경 변수 $OPTINDgetopt로 치면 -- 이전과 이후의 부분을 나누는 역할을 합니다.

커맨드라인 파라미터에서 옵션이 끝나고 이후에 파라미터만 계속해서 나올 때 파라미터의 시작 위치를 $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

위 파라미터 입력에 대한 결과값에서 $OPTIND4로 나타납니다.

-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를 해주어 이후에는 파라미터 구간만 다루게 됩니다.
profile
Devops Engineer

0개의 댓글