Eu gostaria de saber por que essa função recursiva no shell funciona corretamente:
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
Mas ao tocar $ 2 de alguma forma, por exemplo assim:
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
Ele falha com:
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
Invoque
exp 3 0
, salve comoresult1
e pergunte a si mesmo se$(( $result1 * $1 ))
faz sentido agora.A função espera imprimir um número. Você faz imprimir (
echo
) dois números. Em algum momentoresult1
contém dois números e entãoresult=$(( $result1 * $1 ))
está sintaticamente errado.O problema não é que você toca
$2
, é que vocêecho
enche. Sua função é, como você diz, recursiva. Isso significa que ele processará sua própria saída. Assim que você imprimir qualquer coisa que não seja um único número de retorno (que é o que você espera), ele quebrará.Especificamente, sua função fará isso:
Isso funciona bem quando a saída de
exp $1 $tmp
, que é salva comoresult1
um único número. No entanto, quando você ecoa outra coisa, a saída deexp
não é mais um único número, portanto, as operações matemáticas simples que você faz serão interrompidas.