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.
什么新的想法?调用我失踪的函数的一些方法?
答
的$(…)
(命令膨胀)在副壳运行。
当子壳关闭时,子壳内的所有更改都会丢失。
它通常是一个坏主意,使用这两种打印结果,并改变在函数内部的变量。要么使所有变量或只使用一个打印的字符串。
有没有其他的解决方案。
答
设置全局变量是一个函数直接调用它的外壳沟通的唯一途径。通过捕获标准输出来“返回”一个值的做法是由shell的语义引起的一种攻击,这些攻击旨在使得易于调用其他程序,使其不易于执行在壳本身。
所以,不要担心;不,你不会错过任何很酷的技巧。您正在执行shell允许您执行的操作。
是的。如果我正确地阅读,那是我的_dirty解决方案。 –
@SergioGarcíaGalán很好,那么你可以使用它。 – sorontar
最后,我必须重构整个脚本,以便现在不需要这种功能。很高兴它处于早期阶段:-D谢谢大家! –