我正在努力克服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 :(得分:1)
设置全局变量是函数与调用它的shell直接通信的唯一方式。 &#34;返回&#34;的做法捕获标准输出的值是shell的语义所需要的一点点,它的目的是使调用其他程序变得容易,而不是轻松做事< em> in shell本身。
所以,不要担心;不,你不会错过任何很酷的技巧。你正在做shell允许你做的事情。
答案 1 :(得分:0)
$(…)
(命令扩展)在子shell中运行
当子壳关闭时,子壳内的所有变化都会丢失。
使用打印结果和更改函数内的变量通常是个坏主意。要么生成所有变量,要么只使用一个打印的字符串。
没有其他解决方案。