LINUX GETOPTS v1.0
2011.04.20 |
v1.0 |
|
|
|
|
|
|
|
1.
GETOPTS
LINUX 명령을 사용하면 각 명령에 대해 option 을 지정할 수
있다. 이를테면 ls -l, echo -n “” 와 같이 -{argument} 라는 형태로 사용을 한다.
위와 같은 기능을 bash
shell 에서는 GETOPTS 를 통해 지원하고 있다.
2.
USAGE
while getopts
":l:ADVH" opt; do case $opt in l) echo export g_opt=$OPTARG;; A) echo 'A option' export sort='A';; D) echo 'D option' export sort='D';; V) echo 'V option' export print='V';; H) echo 'H option' export print='H';; \?) echo 'usage : commnad [-l] [ -A |
-D ] [ -V | -H ] args...' exit 1 esac done |
while 문에 getopts 를 사용한다.
getopts 뒤에는
arguments 로 어떤 문자를 지정할 것인지 그 항목을 나열한다.
위의 경우에는 ":l:ADVH" 와 같이
사용했는데 이것의 의미는 l 옵션은 추가 인자가 필요하며 나머지 A,
D, V, 그리고 H 인자에 대해서는 추가 인자가 필요하지 않다는 의미이다. l 옵션의 경우 ‘:’ 로 싸여있는데 이것이 추가 인자가 필요하지
않다는 의미이다.
getopts “인자리스트” opt 에서 opt 는 입력인자를 하나씩
받고 case 구문에서 값을 체크하게 된다. 추가 인자를
가져가는 ‘l’ 옵션의 경우 $OPTARG 를 사용해 옵션에
대한 실값을 얻어낼 수 있다.
3.
Scenario
구구단을 만들어라.
사용자의 -ㅣ n 에
대해 n 단의 구구단을 출력한다. ( -l 2 : 2단을
출력 )
n 단을 Ascending 할지 Descending 할지 결정한다. ( -l 2 [ -A | -D ] )
n 단을 세로 출력할지
가로 출력할지 결정한다. (-l 2 [ -H | -V ] )
#!/bin/bash while getopts
":l:ADVH" opt; do case $opt in l) echo export g_opt=$OPTARG;; A) echo 'A option' export sort='A';; D) echo 'D option' export sort='D';; V) echo 'V option' export print='V';; H) echo 'H option' export print='H';; \?) echo 'usage : commnad [-l] [ -A |
-D ] [ -V | -H ] args...' exit 1 esac done shift $(($OPTIND -
1)) if [ ${print:-V} =
'H' ]; then
#print Horizontaly if [ ${sort:-A} = 'D' ]; then #sort with Descending
option for (( i=9; i>0; i-- )) do echo -n ${g_opt} echo -n \* echo -n ${i} echo -n = echo -n
"$((${g_opt}*${i})) " done else for (( i=1; i<10; i++
)) #sort with
Ascending option do echo -n ${g_opt} echo -n \* echo -n ${i} echo -n = echo -n
"$((${g_opt}*${i})) " done fi else
#print vertically if [ ${sort:-A} = 'D' ]; then #sort with
Descending option for (( i=9; i>0; i-- )) do echo -n ${g_opt} echo -n \* echo -n ${i} echo -n = echo
$((${g_opt}*${i})) done else
#sort with Ascending option for (( i=1; i<10; i++ )) do echo -n ${g_opt} echo -n \* echo -n ${i} echo -n = echo $((${g_opt}*${i})) done fi fi echo "" |
앞서 예제로 든
getopts 옵션을 그대로 사용했다.
여기서 유의할 점은
getopts 안에서 얻어진 변수를 해당 제어문 밖에서 사용하기 위한 방법이다.
위에서는 export
variable 을 사용하여 제어문 밖에서도 사용할 수 있게 하였다.
그 이후는 얻어진 변수를 이용해 제어 흐름제어를 하면 완료된다.
(위에서는 2지선다 옵션에 대한 - 이를테면 -A | -D , -V | -H 에 대해 옵션이 두개
사용되었을 때의 예외에 대한 처리를 하지 않았다.)
5.
REFERENCE
A.
Learning
the bash Shell | O’REILLY