본문 바로가기
IT 기술/프로그래밍관련

[bash] 4th - 명령행 옵션과 유형 변수

by 땅뚱 2012. 9. 26.

우선, 옵션의 위치변수를 바꿔주는 명령인 shift 에 대해서 알아보자

# shift - shift positional parameters

DESCRIPTION
    위치 매개변수 1이 n+1 매개변수 2는 n+2 등등으로 값이 재정의 된다. $# 에서 $#-n+1 로 변경되는 쉘 매개변수 개수를 나타내는 변수는 unset 되고 새로운 위치변수의 개수로 업데이트 된다. n 은 특수매개변수 # 값보다 작은 unsigned 10진수이다. n 이 주어지지 않으면 기본적으로 n 값은 1 이된다. n 값이 0 이면 변하는 것이 없다.

 

# getopts

우선 getopts 는 두 개의 인자가 필요하다, 첫째는 문자와 ":" 이 포함된 문자열이고, 각각의 문자는 스크립트 실행시 적용이 가능한 옵션이 된다. 또한 ":" 이 의미하는 것은 해당 옵션에 인자가 필요하다는 것을 의미한다. 둘째는 옵션의 이름을 저장할 변수이다.

 

아래 예제를 보면서 설명해 보자.

while getopts ":ab:c" opt; do

  case $opt in

    a) process option -a ;;

    b) process option -b

       $OPTARG is the option's argument;;

...

  esac

done

shift $(($OPTIND - 1))

...

위 예제에서 script 의 옵션은 모두 a, b, c 세가지가 될 수 있다.즉 <script name> -a -b -c 와 같은 형태의 세가지 옵션이 가능하다는 것이다. ":" 는 옵션에 인자가 필요하다는 것을 의미하기 때문에 b 옵션에는 인자가 필요하다는 것을 알 수 있다. 처음에 나오는 ":" 는 사용자가 잘못된 옵션을 넣었을 때, 오류메시지를 출력하지 않도록 해준다.

옵션에 인자가 있는 경우에는 OPTARG 변수에 저장하기 때문에 코드에서 해당 변수를 사용하여 인수를 처리하도록 한다.

변수 없이 첫번째 나오는 ":" 는 사용자가 잘못된 옵션을 입력했을 때 출력하는 오류 메시지를 출력하지 않도록 한다. b 다음에 : 이 오는 경우에는 b 옵션에 인자가 필요하다는 뜻이다. 이 인자는 OPTARG 변수에 저장된다.

OPTIND 변수에는 인자의 개수가 설정된다. 즉 alice -a -b rabbit 인 경우 $OPTIND 의 값은 4 가 되고, alice -ab rabbit 의 경우 3 이 된다.

getopts 명령을 정리해보면, 다음과 같다.

1. 첫번째 인자는 모든 옵션을 포함하는 문자열이다. 옵션에 인자가 있어야 하는 경우, ":" 을 해당 옵션의 다음에 추가한다. ":" 이 가장 앞에 나온 경우는 사용자가 잘못된 옵션을 입력했을 때, 오류 메시지를 출력하지 않도록 한다.

2. 두번째 인자는 현재 처리되는 각 옵션의 문자가 저장된다. 즉 -b 옵션이 처리되고 있다면 b 값이 저장된다.

3. 옵션에 인자가 있으면 OPTARG 에 저장된다.

4. OPOTIND 변수에는 다음 처리할 명령행의 인자 개수가 저장된다.

 

유형 변수

지금까지 사용한 쉘 변수는 모두 문자를 표현하는 것이다. 하지만 변수에는 읽기전용이나 정수와 같이 다른 속성을 가지는 경우도 있다. 이런 경우에 변수 속성을 정의해주는 것이 declare 함수이다.

내장함수

# declare: declare [-aAfFilrtux] [-p] [name[=value] ...]
    Set variable values and attributes.

    Declare variables and give them attributes.  If no NAMEs are given,
    display the attributes and values of all variables.

- 는 옵션을 켜고, + 는 옵션을 끈다.

옵션

 의미
 -a  변수가 배열로 취급된다
 -f  함수명만 사용한다.
 -F  정의하지 않은 함수명을 출력한다.

 -i

 변수가 정수로 취급된다.

 -r

 변수를 읽기 전용으로 취급한다.

 -x

 내보내기 할 변수를 표시한다.

<example>

declare -i val3=12 val4=5

declare -i result2

result2=val3*val4

echo $result2

 

# 쉘 산술연산

'$((' 와 '))' 사이에 들어있는 내용을 산술연산으로 사용할 수 있다. 즉 OPTIND 의 값이 3인 경우 $(($OPTIND - 1)) 과 같은 구문이 성립하는 것이다. 또는 expr command(외부명령) 사용하여 계산할 수도 있다. 또 한가지 방법은 let 명령을 사용하는 것이다.

굳이 declare 로 선언하지 않고, let 명령을 사용하여 산술구문으로 해석하도록 해준다. 이 경우 declare 와는 다르게 변수가 정수형 변수로 생성되는 것은 아니다. 단지 산술 구문으로 해석하여 계산을 해주게 된다.