Bash函数返回值,同时改变全局变量

时间:2016-11-19 21:14:33

标签: bash global-variables return-value

我正在努力克服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.

有什么新想法吗?调用我缺少的函数的某种方式?

2 个答案:

答案 0 :(得分:1)

设置全局变量是函数与调用它的shell直接通信的唯一方式。 &#34;返回&#34;的做法捕获标准输出的值是shell的语义所需要的一点点,它的目的是使调用其他程序变得容易,而不是轻松做事< em> in shell本身。

所以,不要担心;不,你不会错过任何很酷的技巧。你正在做shell允许你做的事情。

答案 1 :(得分:0)

$(…)(命令扩展)在子shell中运行 当子壳关闭时,子壳内的所有变化都会丢失。

使用打印结果和更改函数内的变量通常是个坏主意。要么生成所有变量,要么只使用一个打印的字符串。

没有其他解决方案。