지역적으로 선언된 변수는 선언된 곳이 포함되어 있는 코드 블럭에서만 보이게 됩니다. 즉, 지역적 "통용 범위"(local scope)를 갖습니다. 함수에 있어 지역 변수는 오직 그 함수 블럭 안에서만 의미를 갖습니다.
예 23-8. 지역 변수의 영역(Local variable visibility)
#!/bin/bash func () { local a=23 echo echo "함수 안에서 a = $a" echo } func # 이제 지역 변수인 'a'가 함수 밖에서도 보이는지 살펴보죠. echo "함수 밖에서 a = $a" # 아니죠. 'a'는 전역적으로 접근할 수 없습니다. echo exit 0 |
지역 변수를 쓰면 재귀 함수 [1] 를 쓸수 있지만, 이 방법은 일반적으로 쓸데 없이 많은 작업량을 필요로 하기 때문에 쉘 스크립트에서는 쓰지 않도록 권장합니다. [2]
예 23-9. 지역 변수를 쓴 재귀 함수
#!/bin/bash # factorial # --------- # bash 가 재귀 함수를 지원할까요? # 음, 그렇긴 하지만 재귀 함수를 쓰려면 머리가 뒤죽박죽 될 겁니다. MAX_ARG=5 E_WRONG_ARGS=65 E_RANGE_ERR=66 if [ -z "$1" ] then echo "사용법: `basename $0` number" exit $E_WRONG_ARGS fi if [ "$1" -gt $MAX_ARG ] then echo "범위 초과(최대 5)." # 현실적으로 이것보다 더 큰 범위를 원한다면 # 실제 프로그래밍 언어로 다시 작성하기 바랍니다. exit $E_RANGE_ERR fi fact () { local number=$1 # "number"를 지역 변수로 선언해 주지 않으면 제대로 동작하지 않습니다. if [ "$number" -eq 0 ] then factorial=1 # 0 의 팩토리얼 = 1. else let "decrnum = number - 1" fact $decrnum # 재귀 함수 호출. let "factorial = $number * $?" fi return $factorial } fact $1 echo "$1 의 팩토리얼은 $? 입니다." exit 0 |
스크립트에서 재귀 함수를 쓰는 예제인 예 A-11도 참고하세요. 스크립트에서 쓰이는 재귀 함수는 특히, 리소스를 많이 잡아 먹고 속도가 느리기 때문에 일반적으로 스크립트에는 적당하지 않습니다.
[1] | Herbert Mayer는 재귀 함수를 "똑같은 알고리즘을 더 간단하게 써서 표현하는 것"이라고 정의했습니다. 재귀 함수란 자기 자신을 부르는 함수를 말합니다. | |
[2] | 재귀가 너무 많이 일어나면 스크립트가 세그폴트(segfault)를 내면서 죽을 수도 있습니다.
|