웹사이트 검색

쉘 스크립팅을 통한 기능 복잡성 심화 - 7부


"셸 스크립트의 함수 이해 및 작성"에 대한 이전 기사에서는 쉘 스크립트에서 함수를 작성하는 방법에 대한 기본 아이디어를 제공했을 수 있습니다. 이제 지역 변수 사용 및 재귀와 같은 기능적 기능에 대해 더 깊이 알아볼 차례입니다.

지역 변수

변수를 지역적으로 만드는 것은 무엇입니까? 변수가 선언된 특정 블록에 따라 다릅니다. local으로 선언된 변수는 해당 변수가 나타나는 코드 블록에서 액세스할 수 있습니다. 즉, 해당 범위는 로컬입니다. 이 내용을 설명하기 위해 아래의 한 가지 예를 살펴보겠습니다.

#!/bin/bash 

func( ) { 
	local i=10 
	j=20 
	echo "i from func = $i" 
	echo "j from func = $j" 
} 

echo "i outside func = $i" 
echo "j outside func = $j" 

func 

echo "i outside func = $i" 
echo "j outside func = $j" 

exit 0

위 스크립트를 실행하면 출력이 됩니다.

i outside func = 
j outside func = 
i from func = 10 
j from func = 20 
i outside func = 
j outside func = 20

이는 처음 2개 echo 문이 실행되는 동안 func 함수가 아직 호출되지 않았기 때문입니다. func 함수를 호출한 후 동일한 2개의 echo 문이 다른 결과를 생성합니다. 이제 로컬이 아닌 func 내부에 선언된 변수 j에 나중에 액세스할 수 있습니다.

따라서 j의 값은 20이 됩니다. 지역 변수 i는 어떻습니까? 해당 범위가 func 함수 내부에 있었기 때문에 외부에서 10 값에 액세스할 수 없었습니다. 일반적으로 func 내에 선언된 변수 j는 기본적으로 전역 변수입니다.

이제 로컬 변수와 이를 함수 블록 내에서 사용하는 방법에 익숙해졌습니다. 함수에서 가장 흥미로운 섹션인 재귀로 넘어가겠습니다.

재귀란 무엇입니까?

자신을 호출하는 함수를 일반적으로 재귀 프로시저라고 합니다. 또는 동일한 알고리즘의 더 간단한 버전을 사용하여 알고리즘을 표현하는 것으로 정의할 수도 있습니다. 숫자의 계승을 구하는 예를 생각해 보세요. 우리는 n을 알고 있습니다!=1 x 2 x 3 x … x (n-1) x n. 따라서 우리는 재발 관계를 다음과 같이 작성할 수 있습니다.

n! = (n-1)! x n

따라서 동일한 함수를 재귀적으로 호출하고 각 호출의 반환 값을 사용하여 이전 결과와 곱하는 것이 쉽습니다.

5! = 4! x 5
4! = 3! x 4
3! = 2! x 3
2! = 1! x 2
1! = 0! x 1

지역 변수를 사용한 재귀

여기서는 지역 변수와 재귀를 사용하여 숫자의 계승을 찾는 스크립트를 작성해 보겠습니다.

#!/bin/bash 

fact( ) { 
	local num=$1 
	if [ $num -eq 0 ]; then 
		ret=1 
	else 
		temp=$((num-1)) 
		fact $temp 
		ret=$((num*$?)) 
	fi 
	return $ret 
} 

fact 5 

echo "Factorial of 5 = $?" 

exit 0

num은 각 호출에서 각 n-1 값을 저장하는 데 사용되는 지역 변수입니다. 여기서 기본 조건은 숫자가 0인지 여부를 확인합니다(0!=1이고 계승은 음수에 대해 정의되지 않기 때문). 이 기본 조건에 도달하면 호출자에게 1 값을 반환합니다. 이제 num=1이고 ret=1 x 1입니다.

이 순간 호출자에게 1을 반환합니다. 이제 num=2ret=2 x 1 등이 됩니다. 마지막으로 num=5일 때 반환 값은 24이고 최종 결과는 ret=5 x 24입니다. 최종 결과 120이 초기 호출자 명령문으로 전달되어 표시됩니다.

위 스크립트에는 한 가지 문제가 있습니다. 이전 기사에서 설명했듯이 함수는 큰 정수를 반환할 수 없습니다. 따라서 위 문제에 대한 해결책을 찾는 것은 사용자의 몫입니다.

질문. 지역 변수를 사용하지 않고 재귀를 수행할 수 있나요? 대답은입니다.

지역 변수가 없는 재귀

재귀를 사용하여 피보나치 수열을 표시하는 다음 예를 살펴보세요. 기본 재발 관계는 다음과 같습니다.

fib(0) = 0 
fib(1) = 1 
else 
	fib(n) = fib(n-1) + fib(n-2)

Fibonacci series using recursion

#!/bin/bash 

fib( ) { 
	a=$1 
	if [ $a -lt 2 ]; then 
		echo $a 
	else 
		((--a)) 
		b=$(fib $a) 

		((--a)) 
		c=$(fib $a) 

		echo $((b+c)) 
	fi 
} 

for i in $(seq 0 15) 
do 
	out=$(fib $i) 
	echo $out 
done 

exit 0

위 스크립트에서는 지역 변수가 사용되지 않습니다. 실행 중 스크립트의 흐름을 이해할 수 있기를 바랍니다.

여기서 15 값은 표시할 피보나치 수열의 항 수를 나타냅니다. 위 스크립트 실행과 관련하여 특별한 점을 발견하셨나요? 시간이 좀 걸리죠? 스크립트의 재귀는 C와 같은 프로그래밍 언어의 재귀보다 느립니다.

이번 글을 통해 쉘 스크립팅의 함수 부분을 마무리하려고 합니다. 어레이 등에 대한 향후 기사를 보려면 Tecmint를 통해 최신 소식을 받아보세요.