Shell變數的作用域問題

PSZWQ發表於2020-09-30

1、問題

Shell變數的作用域是在本Shell內,屬於本Shell的全域性變數,也就是從定義該變數的地方開始到Shell結束,或到主動使用unset刪除了該變數的地方為止。在變數的作用域內,該變數都是可見的,在函式內對變數也是可以訪問、可修改的,這和C語言極為不同。

在這裡插入圖片描述
2、差別

同樣的程式碼用C實現後,VAR_02的值並沒有受到函式內部同名變數的影響。

在這裡插入圖片描述
3、原因

存在這種差別的原因在於,Shell預設以Shell的程式ID作為一個名稱空間,所以即便是在函式中宣告變數,該變數也會在全域性生效。而C語言會對函式內的變數單獨建立名稱空間,這樣就不會影響全域性定義的同名變數。Shell的這種特性在一般情況下是沒有太大問題的,但有時確實可能會給程式的開發造成麻煩,特別是當指令碼實現了模組化的開發後,不同的人共同維護同一個指令碼中不同功能的程式碼時,很可能大家都會用到比較常見的類似於i、j、k這樣的臨時變數(特別是在函式內部,使用這樣的變數尤為常見),這無疑會造成問題。

4、解決方案

為了解決這種問題,在函式內部宣告的臨時變數需要用local指定其為只在函式內生效的“區域性變數”,這樣這些變數將只存在於區域性的名稱空間內,從而不會對全域性變數有影響。下面按照這種方式對Namespace03.sh進行修改,在函式內部使用local宣告變數VAR_02,再次執行然後檢視效果。

在這裡插入圖片描述
從執行結果可以看到,在函式體內使用local關鍵字宣告瞭和全域性變數同名的區域性變數後,對該變數的操作只會影響區域性變數,而不會影響與之同名的全域性變數。

相關文章