シェルでこの再帰関数がなぜうまく機能するのかを知りたいです。
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
なくなり、実行中の単純な数学が壊れます。