2016-08-15 46 views
2

在下面的bash脚本中,我声明了一个变量后跟一个函数。我试图获得函数的返回值。它应该是1,但它总是0.当我删除本地声明时,它会按我的意愿工作。 为什么本地声明会打破以下函数的返回值? 本地声明是一种类型的命令,如“if []”? 请让我知道原因。为什么从bash中的本地声明之后的函数返回值始终为0?

我的测试功能被以下,

function inner_func() { 
    local RETURN_00=1 
    echo "RETURN_00 = $RETURN_00" 
    echo "RETURN_00 = $RETURN_00" >&2 
    return $RETURN_00 
} 

function func() { 
    local ECHO_00=$(inner_func) # this local declaration is a problem 
    local RETURN_01=$? 
    echo "RETURN_01 = $RETURN_01" 
    echo "RETURN_01 = $RETURN_01" >&2 
    return $RETURN_01 
} 

ECHO_01=$(func) 
RESULT=$? 
echo "RESULT = $RESULT" 
的上面的代码

结果因此使用它重置$?0(假设本地跟随

RETURN_00 = 1 
RETURN_01 = 0 
RESULT = 0 
+0

顺便说一句,这是一件http://shellcheck.net/捕获并建议一修复程序。 –

回答

4

local是它自己的协议的命令时,分配是成功的),所以当你这样做时:

local ECHO_00=$(inner_func) 
local RETURN_01=$? # $? has already been reset to 0 by the command local on the previous line. 

相反,你可以这样做:

local ECHO_00 
ECHO_00=$(inner_func) 
local RETURN_01=$? 

这样ECHO_00仍然是局部的,但你也可以访问你的子shell调用该函数的返回值。输出:

RETURN_00 = 1 
RETURN_01 = 1 
RESULT = 1 
1

当在同一命令中声明并分配局部变量时,变量赋值发生在本地声明之前。所以$的价值?是本地声明操作的返回值。

参见http://tldp.org/LDP/abs/html/localvar.html(第三灰块从顶部)

+1

Boo,hiss re:使用ABS作为参考。 (freenode #bash频道花时间做的一半是帮助人们理解他们在那里拾起的坏习惯;这是非常多的bash学校)。 –

+0

够公平的,但我确实证实了这个例子没有本地声明,并且提供的解释对我有意义。有和没有本地,结果是不同的。 – mdewit

+0

当然 - 我不是说在这个特殊情况下ABS是错误的。大多数令人反感的东西并不是完全不正确的信息(当它*完全不正确时,通常是由于缺乏维护),但是没有注意避免不良习惯的例子与它们无关当时展示*,所以使用其代码示例作为模板的人往往会得到非常错误的代码。 –

相关问题