我想知道为什么 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
Invoke
exp 3 0
,将其另存为result1
并问自己$(( $result1 * $1 ))
现在是否有意义。该函数希望自己打印一个数字。你让它打印 (
echo
) 两个数字。在某些时候result1
包含两个数字,然后result=$(( $result1 * $1 ))
在语法上是错误的。问题不在于你触摸
$2
,而在于你的echo
东西。正如您所说,您的功能是递归的。这意味着它将处理自己的输出。一旦您打印出除单个返回编号(这是您所期望的)以外的任何内容,它就会中断。具体来说,您的函数将执行以下操作:
exp $1 $tmp
当保存为result1
单个数字的 的输出时,这可以正常工作。但是,当您回显其他内容时,输出exp
不再是单个数字,因此您执行的简单数学运算将中断。