2016-08-15 45 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是錯誤的。大多數令人反感的東西並不是完全不正確的信息(當它*完全不正確時,通常是由於缺乏維護),但是沒有注意避免不良習慣的例子與它們無關當時展示*,所以使用其代碼示例作爲模板的人往往會得到非常錯誤的代碼。 –

相關問題