쉘의 함수 재귀

쉘의 함수 재귀

쉘에서 이 재귀 함수가 왜 잘 작동하는지 알고 싶습니다.

exp ( )
    {
        local result
        #local op1="$1"
        #echo $2
        if [[ $2 -eq 0 ]]; then
            echo 1
            return
        fi 
        tmp=$(( $2 - 1 ))
        local result1=$(exp $1 $tmp )
        result=$(( $result1 * $1 ))
        echo $result
    }
    exp 3 4 

그러나 $2를 어떤 식으로든 터치하면 다음과 같습니다.

exp ( )
    {
        local result
        echo $2
        if [[ $2 -eq 0 ]]; then
            echo 1
            return
        fi 
        tmp=$(( $2 - 1 ))
        local result1=$(exp $1 $tmp )
        result=$(( $result1 * $1 ))
        echo $result
    }
    exp 3 4 

다음과 같이 실패합니다.

4
foo.sh: line 15: 0
1 * 3 : syntax error in expression (error token is "1 * 3 ")
foo.sh: line 15: 2
3 * 3 : syntax error in expression (error token is "3 * 3 ")
9

답변1

문제는 당신의 손길이 아니라 $2당신의 물건입니다 echo. 당신이 말했듯이, 당신의 기능은 재귀적입니다. 이는 자체 출력을 처리한다는 의미입니다. 단일 반환 번호(예상한 대로) 이외의 다른 항목을 인쇄하자마자 충돌이 발생합니다.

구체적으로 함수는 다음을 수행합니다.

    tmp=$(( $2 - 1 ))
    local result1=$(exp $1 $tmp )
    result=$(( $result1 * $1 ))
    echo $result 

exp $1 $tmp(단일 숫자로 저장)의 출력이 result1잘 작동합니다 . 그러나 다른 것을 에코하면 의 출력은 exp더 이상 단일 숫자가 아니므로 수행 중인 간단한 수학이 깨집니다.

답변2

을 호출하고 exp 3 0다른 이름으로 저장한 후 이제 의미가 있는지 result1스스로에게 물어보세요 .$(( $result1 * $1 ))

함수는 자체적으로 숫자를 인쇄할 것으로 예상합니다. 두 개의 숫자를 인쇄( )하도록 합니다 echo. result1두 개의 숫자를 포함하는 어느 시점에서는 result=$(( $result1 * $1 ))구문상 잘못된 것입니다.

관련 정보