Shell變數的作用域問題
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關鍵字宣告瞭和全域性變數同名的區域性變數後,對該變數的操作只會影響區域性變數,而不會影響與之同名的全域性變數。
相關文章
- js中變數作用域問題JS變數
- golang變數作用域問題-避免使用全域性變數Golang變數
- 變數、作用域和記憶體問題變數記憶體
- javascript:變數、作用域和記憶體問題JavaScript變數記憶體
- javascript變數、作用域和記憶體問題......JavaScript變數記憶體
- 變數作用域變數
- lisp 變數的作用域Lisp變數
- 第4章 變數、作用域和記憶體問題變數記憶體
- JS變數作用域JS變數
- SCSS 變數作用域CSS變數
- golang變數作用域Golang變數
- shell 變數賦值問題變數賦值
- java中變數的作用域Java變數
- JavaScript 變數的作用域鏈JavaScript變數
- Go 程式碼塊與作用域,變數遮蔽問題詳解Go變數
- python變數與變數作用域Python變數
- js作用域(變數提升,預解析)例題JS變數
- PL/SQL變數作用域SQL變數
- LoadRunner變數作用域變數
- C# 變數作用域C#變數
- 現代 JavaScript 的變數作用域JavaScript變數
- Go語言中的變數作用域Go變數
- 變數的作用域--js閉包變數JS
- 理解 Javascript 中變數的作用域JavaScript變數
- javascript中的作用域(全域性變數和區域性變數)JavaScript變數
- 變數物件與作用域鏈變數物件
- JavaScript中變數和作用域JavaScript變數
- JavaScript之變數及作用域JavaScript變數
- Go 語言變數作用域Go變數
- JavaScript變數作用域之殤JavaScript變數
- Go 中的動態作用域變數Go變數
- 注意for迴圈中變數的作用域變數
- c++臨時變數的作用域C++變數
- 函式(三)作用域之變數作用域、函式巢狀中區域性函式作用域、預設值引數作用域函式變數巢狀
- 變數、作用域與記憶體變數記憶體
- ES6(二: 變數作用域)變數
- Java 8 之 lambda 變數作用域Java變數
- Day08-常量、變數、作用域變數