2012-08-10 98 views
3

我在CentOS上的/etc/init.d/functions中發現了以下代碼。Shell腳本:「本地foo」和「本地foo =」有區別嗎?

status() { 
    local base pid lock_file= pid_file= 
    ... 

4個變量被聲明。 其中兩個未初始化,base和pid。 但其餘的部分都是用空值,lock_file和pid_file初始化的。

我測試了下面的代碼,發現沒有區別。

local a b= 

echo "a is $a, length is ${#a}" 
echo "b is $b, length is ${#b}" 

它們之間有什麼區別嗎?

+0

本地是功能,對嗎?如果在函數外部設置了「foo」的值,會發生什麼? (我沒有bash方便測試)。祝你好運。 – shellter 2012-08-10 23:35:51

+0

與其他語言一樣,我們不能從「本地聲明語句」引用外部變量。所以如果你聲明局部變量的外部名稱相同,它將被視爲其他變量。 – taichino 2012-08-13 05:01:36

回答

3

是的,有有區別。考慮下面的函數:

x() { 
    local a b= 

    echo ${a-X} 
    echo ${b-X} 
} 

調用此函數中bash-4.x結果在這樣的輸出:

$ x 
X 

$ 

${parameter−word}parameter expansion膨脹到的word膨脹(在這種情況下X)如果參數設置爲no,或者如果設置了參數值。

從示例輸出中可以明顯看出,local a未設置變量a,而local b=顯式設置爲空(空)字符串。

編輯:

在另一方面,在bash-3.x你會得到這樣的:

$ x 


$ 

函數內set調用驗證local abash-3.x初始化該變量爲空字符串。然而,這似乎是一個錯誤。從bash的changelog:

本文詳細介紹這個版本時,bash-4.0-β, 和以前的版本時,bash-4.0-α的變化。

...

e。修復了一個錯誤,該錯誤導致使用空值 字符串爲局部變量創建值而不是無值。

+0

謝謝你的迴應! 但是x函數不適用於我,它顯示了2個空行。 我檢查了bash(3.2.48)和zsh(4.3.11)。 我的環境有問題嗎? – taichino 2012-08-13 04:48:34

+0

@taichino:看到我的更新... – thkala 2012-08-13 06:32:07

+0

非常感謝!我可以用bash-4.2.37來證實這一點。 我不太瞭解shell腳本,所以我會更多地學習它! – taichino 2012-08-13 14:27:05

相關問題