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

Bash函数返回值,同时更改全局变量,bash,global-variables,return-value,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 $My

我正在努力使用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.
有什么新想法吗?调用我缺少的函数的某种方式?

在子shell中运行
$(…)
(命令扩展)。
关闭子外壳时,子外壳内的所有更改都将丢失

在函数中同时使用打印结果和更改变量通常不是一个好主意。要么生成所有变量,要么只使用一个打印字符串

没有其他解决方案。

在子shell中运行
$(…)
(命令扩展)。
关闭子外壳时,子外壳内的所有更改都将丢失

在函数中同时使用打印结果和更改变量通常不是一个好主意。要么生成所有变量,要么只使用一个打印字符串


没有其他解决方案。

设置全局变量是函数与调用它的shell直接通信的唯一方法。通过捕获标准输出来“返回”值的实践是shell语义所必需的一点技巧,它旨在使调用其他程序变得容易,而不是使在shell本身中做事情变得容易


所以,别担心;不,你不会错过任何很酷的技巧。您正在执行shell允许您执行的操作。

设置全局变量是函数与调用它的shell直接通信的唯一方式。通过捕获标准输出来“返回”值的实践是shell语义所必需的一点技巧,它旨在使调用其他程序变得容易,而不是使在shell本身中做事情变得容易


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

@SergioGarcíaGalán好吧,然后你可以使用它。最后,我重新构造了我的整个脚本,这样现在就不需要这种函数了。很高兴这是在早期阶段:-D谢谢大家@SergioGarcíaGalán很好,然后你可以使用它。最后,我重新构造了我的整个脚本,这样现在就不需要这种函数了。很高兴这是在早期阶段:-D谢谢大家!