shell中的函数递归

shell中的函数递归

我想知道为什么 shell 中的这个递归函数可以正常工作:

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 ))在语法上是错误的。

相关内容