请考虑以下代码:
recursion_test() {
local_var=$1
echo "Local variable before nested call: $local_var"
if [[ $local_var == "yellow" ]]; then
return
fi
recursion_test "yellow"
echo "Local variable changed by nested call: $local_var"
}
输出:
Local variable before nested call: red
Local variable before nested call: yellow
Local variable changed by nested call: yellow
在其他编程语言(如Java)中,每个方法调用都有一个单独的私有堆栈帧,其上保留了局部变量。因此,嵌套的方法调用不能修改父调用中的变量。
在Bash中,所有调用都共享相同的堆栈帧吗?有没有办法为不同的调用提供单独的局部变量?如果没有,是否有正确编写递归函数的解决方法,以便一次调用不会影响另一个?
答案 0 :(得分:6)
你想要local
内置。在您的示例中尝试local local_var=$1
。
注意:您仍需要小心,因为local
不像C
堆栈变量那样完全私有。它更像javascript
的{{1}},这意味着任何被调用的[子]函数都可以获得它[对比] js的var
, 完全私有]。
以下是一个例子:
let
所以,如果你使用recursion_test() {
local local_var=$1
echo "Local variable before nested call: $local_var"
# NOTE: if we use other_func_naughty instead, we get infinite recursion
other_func_nice
if [[ $local_var == "yellow" ]]; then
return
fi
recursion_test "yellow"
echo "Local variable changed by nested call: $local_var"
}
other_func_naughty() {
local_var="blue"
}
other_func_nice() {
local local_var="blue"
}
recursion_test red
,请确保一致(即所有函数都以相同的方式声明)