"셸 스크립트의 함수 이해 및 작성"에 대한 이전 기사에서는 셸 스크립트에서 함수를 작성하는 방법에 대한 기본 아이디어를 제공했을 수 있습니다. 이제 지역 변수 및 재귀 사용과 같은 기능적 기능에 대해 더 깊이 알아볼 시간입니다.
로컬 변수
변수를 로컬로 만드는 것은 무엇입니까? 변수가 선언된 특정 블록에 따라 다릅니다. 로컬으로 선언된 변수 범위가 로컬인 코드 블록에서 액세스할 수 있습니다. 이것을 설명하기 위해 아래의 한 가지 예를 살펴보겠습니다.
#!/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 외부 func =$j" func echo "i 외부 func =$i" echo "j 외부 func =$j" exit 0
위의 스크립트를 실행하면 출력이 됩니다.
i 외부 func =j 외부 func =i from func =10 j from func =20 i 외부 func =j 외부 func =20
func 함수가 처음 2개 동안 아직 전화를 걸지 않았습니다. echo 문을 실행했습니다. func 함수를 호출한 후 동일한 2개의 echo 문 다른 결과를 생성합니다. 이제 변수 j , func 내부에 선언되었습니다. 로컬이 아닌 나중에 액세스할 수 있습니다.
따라서 j의 값 20이 됩니다. . 지역 변수 i는 어떻습니까? ? 범위가 func 함수 안에 있기 때문에 , 값 10 외부에서 접근할 수 없었다. 변수 j 일반적으로 func 내부에 선언됨 기본적으로 전역입니다.
이제 지역 변수와 이를 펑션 블록 내에서 사용하는 방법에 익숙해졌습니다. 함수에서 가장 흥미로운 부분인 재귀로 넘어가겠습니다.
재귀란 무엇입니까?
자신을 호출하는 함수를 일반적으로 재귀 프로시저라고 합니다. 또는 동일한 알고리즘의 더 간단한 버전을 사용하여 알고리즘을 표현하는 것으로 정의할 수 있습니다. 숫자의 계승을 찾는 예를 고려하십시오. 우리는 n! =1 x 2 x 3 x ... x (n-1) x n . 따라서 다음과 같이 반복 관계를 작성할 수 있습니다.
<전>엔! =(n-1)! x n따라서 동일한 함수를 재귀적으로 호출하고 각 호출의 반환 값을 사용하여 이전 결과와 곱하는 것이 쉽습니다. 즉,
5! =4! x 54! =3! x 43! =2! x 32! =1! x 21! =0! x 1
로컬 변수를 사용한 재귀
여기서 우리는 지역 변수와 재귀를 사용하여 숫자의 계승을 찾는 스크립트를 작성하려고 합니다.
#!/bin/bash 사실( ) { 지역 번호=$1 if [ $num -eq 0 ]; then ret=1 else temp=$((num-1)) 팩트 $temp ret=$((num*$?)) fi return $ret } 팩트 5 echo "5의 팩토리얼 =$?" 0번 출구
숫자 각 n-1을 저장하는 데 사용되는 지역 변수입니다. 각 호출에 대한 가치. 여기서 기본 조건은 숫자가 0인지 여부를 확인합니다(0! =1이고 음수에 대해 계승이 정의되지 않았기 때문에). 이 기본 조건에 도달하면 1 값을 반환합니다. 호출자에게. 이제 숫자 =1 및 ret =1 x 1 .
이 순간 1을 반환합니다. 호출자에게. 이제 숫자 =2 및 ret =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)재귀를 사용하는 피보나치 수열#!/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 종료 0 종료
위의 스크립트에서는 지역 변수를 사용하지 않습니다. 실행 중 스크립트의 흐름을 이해하시길 바랍니다.
여기 값 15 피보나치 수열의 항 수를 나타냅니다. 표시됩니다. 위의 스크립트 실행과 관련하여 특별한 점을 발견하셨습니까? 시간이 좀 걸리죠? 스크립트의 재귀는 C와 같은 프로그래밍 언어의 재귀보다 느립니다. .
이 기사를 통해 쉘 스크립팅의 기능 부분을 마무리할 계획입니다. Tecmint로 최신 소식 받기 배열에 대한 향후 기사 보기 그리고 훨씬 더…