我有一個函數可以對自己進行多次調用,但它似乎接近它的終止值。例如bash函數在遞歸調用時是否創建自己的新實例?
function multi() {
a = $1
b = $2
c = a + b
if [[ a > 2 ]]
then
let "$a = $a -1"
multi $a $b
fi
}
當調用多 - 新的子功能,使用舊的變量
我有一個函數可以對自己進行多次調用,但它似乎接近它的終止值。例如bash函數在遞歸調用時是否創建自己的新實例?
function multi() {
a = $1
b = $2
c = a + b
if [[ a > 2 ]]
then
let "$a = $a -1"
multi $a $b
fi
}
當調用多 - 新的子功能,使用舊的變量
隱式創建的變量是全球當前的外殼 - 這樣,你的函數的每一個遞歸將覆蓋同一個全局變量。
聲明你的變量爲local
,使它們在函數(調用)中是本地的。
這就是說,有多個問題與你的函數(如果你真的使用bash
,你的函數不應該執行的話):
=
(除非內部((...))
)c = a + b
必須內部((...))
((...))
執行(或者,使用[[ ... ]]
與-gt
,但您的變量引用必須$
-prefixed)$
前綴上的左側分配傳遞到let
- 最好,不過,使用((...))
這裏也,因爲它簡化了的東西:let "a = $a -1"
簡直變成((--a))
一般來說,在http://shellcheck.net粘貼代碼將揭示這些問題。
這裏是可用的版本:
function multi() {
local a b c # declare variables as _local_
a=$1
b=$2
((c = a + b))
if ((a > 2))
then
((--a))
multi $a $b
fi
}
感謝您解釋局部變量如何工作。我並不擔心這個功能的正確性。 –
這是因爲你有幾個錯誤。這裏的工作版本:
function multi() {
a=$1
b=$2
c=a+b
if [[ $a -gt 2 ]]
then
let "a = $a -1"
multi $a $b
fi
}
你有
if [[ a > 2 ]]
當它應該已經:
if [[ $a -gt 2 ]]
另外,let語句是錯誤的。它應該是:
let "a = $a -1"
'[[$ a> 2]]'執行_lexical_比較;數字使用'-gt'。 – mklement0
@ mklement0固定。我錯過了那一個。 –
你是怎麼稱呼這個功能的? –
'c = a + b'有什麼意義? – konsolebox