Вам нужно $(( ))
, чтобы форсировать арифметическую оценку. Тогда вы можете сделать это с помощью возвращаемых значений:
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"
но это плохая идея, потому что оболочка вроде возвращает ненулевые возвращаемые значения для сообщения об ошибке (например, вышеупомянутое решение
«сломается» set -e
).
Идиоматически, вы можете использовать стандартный вывод:
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"
но это неэффективно со всеми подоболочками.
Лучше всего избегать рекурсии и просто зацикливаться:
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