【問題】html
在折騰一個linux shell腳本,寫了個遞歸嵌套的函數,可是運行過程當中,發現一個問題是,linux
上層函數,調用下層函數的時候,下層函數中的值變了後,再返回上層調用,結果其值沒有恢復,即父級函數調用子級函數,子級函數中改變了某變量的值,返回父級函數後,父級函數中的值,也被改變了。shell
【解決過程】bash
1.折騰了好半天,結果始終沒有眉目。ide
2.後來無心間找到這裏:函數遞歸,則看到了具體的解釋:函數
問:函數遞歸
在bash shell中遞歸函數中的變量的問題!
是否是在整個遞歸調用的過程當中,使用同一名稱的變量就是同一個變量。換句話說就是在下一層的調用中修改了變量var,當返ui回上層時,上層的var的值也被修改了。this
答:spa
爲防止下層的修改對上層的影響, 對 function 中的 variable 要限制爲 local 的。
bash:
fun () {
local abc
..
}
ksh:
fun () {
typeset abc
..
}
[quote]原帖由 "寂寞烈火"]因爲用遞歸函數,好像對於腳本效能不是很好的,有本書說盡可能避免過多的使用遞歸(忘了哪本書了)[/quote 發表:
Page 310 in << Advanced Bash−Scripting Guide >> :
[quote]Local variables permit recursion, but this practice generally involves much computational overhead and
is definitely not recommended in a shell script..net
而後本身去試了下,果真就能夠解決此問題了。
【總結】
Linux shell中,定義的函數變量,默認是全局global的,即便是在函數中定義的變量,也是。
因此,遞歸函數中的變量,因爲多數都是局部變量,致使:
下一層調用中修改了某個變量之,返回上一層後,同一個變量的值,也同時被改變了,
因此致使運行結果不對。
解決辦法就是,把(遞歸函數中的)全部的變量以前加上local定義,表示局部變量,這樣運行的結果,和函數執行邏輯,就和C等其餘語言相似,結果也就都正確了。