如何从修改全局变量的函数返回值?

时间:2013-12-15 16:06:48

标签: sh

如果我想存储函数 f 的输出,我可以result=$(f)但是如果 f 修改全局变量,这将不起作用,因为f是在子壳中执行。

这是一个说明问题的例子:

x=0

f()
{
    x=1
    echo "f"
}

result=$(f)

最后结果是“f”但是 x 是(仍然)0。有没有办法调用 f 以便它有副作用将结果存储在变量中吗?

1 个答案:

答案 0 :(得分:1)

您的选择:

1)在子shell中调用函数NOT并使用带有返回码的return

f()
{
   x=1
   return 15
}

x=0
f
r=$?
echo "$r $x"

将导致:

15 1

因此你们都改变了x 并且获得了一些返回代码(甚至不是字符串)

2)shell和子shell之间的IPC

Subshel​​l是另一个进程,因此它无法访问父shell的变量。

但您可以构建一些自定义消息。 最简单 - 将“副作用”存储在一个完美的全局变量存储文件中。

f()
{
    echo "1" > x.tmp
    echo "f"
}

result=$(f) #"x" value is stored in x.tmp 

3)将结果和副作用一起作为连续结果返回。

f() 
{
     x=1
     echo "$x:f" 
}

result_with_separator=$(f)