2014-06-12 50 views

回答

2

隱式創建的變量是全球當前的外殼 - 這樣,你的函數的每一個遞歸將覆蓋同一個全局變量。

聲明你的變量爲local,使它們在函數(調用)中是本地的。

這就是說,有多個問題與你的函數(如果你真的使用bash,你的函數不應該執行的話):

  • 變量分配不能有空格周圍=(除非內部((...))
  • 算術表達式如c = a + b必須內部((...))
  • 數值比較以進行必須內((...))執行(或者,使用[[ ... ]]-gt,但您的變量引用必須$ -prefixed)
  • 作爲@Florin Stingaciu在他的回答中指出,你不能使用$前綴上的左側分配傳遞到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 
} 
+0

感謝您解釋局部變量如何工作。我並不擔心這個功能的正確性。 –

0

這是因爲你有幾個錯誤。這裏的工作版本:

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" 
+0

'[[$ a> 2]]'執行_lexical_比較;數字使用'-gt'。 – mklement0

+0

@ mklement0固定。我錯過了那一個。 –

相關問題