2016-11-19 120 views
0

我只是在用bash函數掙扎,並試圖返回字符串值,同時一些全局變量在函數內被修改。舉個例子:Bash函數返回值同時改變全局變量

MyGlobal="some value" 

function ReturnAndAlter() { 
    MyGlobal="changed global value" 
    echo "Returned string" 
} 

str=$(ReturnAndAlter) 
echo $str   # prints out 'Returned value' as expected 
echo $MyGlobal  # prints out the initial value, not changed 

這是因爲$(...)(也`...`如果用來代替)導致函數有它自己的環境,使全局變量是永遠不會受到影響。

我發現了一個很骯髒的解決方法由值返回到另一個全局變量,調用函數僅使用其名稱,但認爲應該做一個更清潔的方式。

我骯髒的解決方案:

MyGlobal="some value" 
ret_val="" 

function ReturnAndAlter() { 
    ret_val="Returned string" 
    MyGlobal="changed value" 
} 

ReturnAndAlter   # call the bare function 
str=$ret_val    # and assign using the auxiliary global ret_val 
echo $str 
echo $MyGlobal   # Here both global variables are updated. 

什麼新的想法?調用我失蹤的函數的一些方法?

回答

0

$(…)(命令膨脹)在副殼運行。
當子殼關閉時,子殼內的所有更改都會丟失。

它通常是一個壞主意,使用這兩種打印結果,並改變在函數內部的變量。要麼使所有變量或只使用一個打印的字符串。

有沒有其他的解決方案。

+0

是的。如果我正確地閱讀,那是我的_dirty解決方案。 –

+0

@SergioGarcíaGalán很好,那麼你可以使用它。 – sorontar

+0

最後,我必須重構整個腳本,以便現在不需要這種功能。很高興它處於早期階段:-D謝謝大家! –

1

設置全局變量是一個函數直接調用它的外殼溝通的唯一途徑。通過捕獲標準輸出來「返回」一個值的做法是由shell的語義引起的一種攻擊,這些攻擊旨在使得易於調用其他程序,使其不易於執行殼本身。

所以,不要擔心;不,你不會錯過任何很酷的技巧。您正在執行shell允許您執行的操作。