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

问题描述:

我只是在用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

是的。如果我正确地阅读,那是我的_dirty解决方案。 –

+0

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

+0

最后,我必须重构整个脚本,以便现在不需要这种功能。很高兴它处于早期阶段:-D谢谢大家! –

设置全局变量是一个函数直接调用它的外壳沟通的唯一途径。通过捕获标准输出来“返回”一个值的做法是由shell的语义引起的一种攻击,这些攻击旨在使得易于调用其他程序,使其不易于执行壳本身。

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