シェルでこの再帰関数がなぜうまく機能するのかを知りたいです。
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 ))
関数はそれ自体が数字を印刷することを期待しています。 2つの数字を印刷するようにしますecho
。result1
2つの数字を含むある時点では、result=$(( $result1 * $1 ))
構文的に間違っています。