我想知道为什么 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 ))
在语法上是错误的。