Linux Shell脚本递归指数

时间:2018-11-11 10:55:01

标签: linux bash shell recursion command-line

我正在编写一个脚本,该脚本接受2个数字作为输入,并使用递归将数字加到另一个简单的幂运算的幂上。但是,我是脚本新手,无法弄清楚这里语法错误的地方。

这是脚本

#!/bin/bash
echo "Enter number: "
read number
echo "Enter power: "
read power

echo "Powering $number to power of $power!" 

exp () {

    if [ $2 = 1 ]
    then
        return $1
    fi

    return $1 * $(exp $1 $2-1 )

}

result=$(exp $number, $power)

echo "Result: $result"

当前,它会冻结,我不确定我是否正确使用了参数(就语法而言)。

1 个答案:

答案 0 :(得分:1)

您需要$(( ))来强制进行算术评估。然后,您可以使用返回值:

number=2 power=7
exp () {
    if [ $2 -eq 1 ]; then return $1; fi
    exp $1 $(($2-1))
    return $(($1 * $?))
}
exp $number $power; result=$?
echo "Result: $result"

但这是一个坏主意,因为shell会保留非零的返回值以进行通信失败(例如,上述解决方案 将“破坏” set -e)。

更多地,您可以使用stdout:

set -e
number=2 power=7
exp () {
    if [ $2 -eq 1 ]; then echo $1; return; fi
    echo $(($1 * $(exp $1 $(($2-1)) ) ))
}
result=$(exp $number $power)
echo "Result: $result"

但是对于所有子shell来说效率低下。 最好避免递归并简单地循环:

number=2 power=7
exp () {
    local res=1 i=0;
    while [ $i -lt $2 ]; do res=$((res*$1)); i=$((i+1)); done
    echo $res
}
exp $number $power