우선, 옵션의 위치변수를 바꿔주는 명령인 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 와는 다르게 변수가 정수형 변수로 생성되는 것은 아니다. 단지 산술 구문으로 해석하여 계산을 해주게 된다.
'IT 기술 > 프로그래밍관련' 카테고리의 다른 글
[bash] 5th - Trap Statement (0) | 2013.08.01 |
---|---|
[linux] openat / open 의 차이점 (0) | 2012.12.28 |
[bash] 3rd - 흐름제어 (0) | 2012.08.27 |
[bash] 2nd - 기본 쉘 프로그래밍 (0) | 2012.08.10 |
bash 활용 첫번째 정리 - 명령행 편집 (0) | 2012.08.08 |