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關鍵字宣告瞭和全域性變數同名的區域性變數後,對該變數的操作只會影響區域性變數,而不會影響與之同名的全域性變數。
相關文章
- golang變數作用域問題-避免使用全域性變數Golang變數
- javascript:變數、作用域和記憶體問題JavaScript變數記憶體
- 變數作用域變數
- shell 變數賦值問題變數賦值
- 第4章 變數、作用域和記憶體問題變數記憶體
- Go 程式碼塊與作用域,變數遮蔽問題詳解Go變數
- JS變數作用域JS變數
- SCSS 變數作用域CSS變數
- python變數與變數作用域Python變數
- java中變數的作用域Java變數
- JavaScript 變數的作用域鏈JavaScript變數
- js作用域(變數提升,預解析)例題JS變數
- C# 變數作用域C#變數
- Go語言中的變數作用域Go變數
- 現代 JavaScript 的變數作用域JavaScript變數
- javascript中的作用域(全域性變數和區域性變數)JavaScript變數
- pytest 的 fixture 作用域問題
- 變數物件與作用域鏈變數物件
- JavaScript之變數及作用域JavaScript變數
- JavaScript中變數和作用域JavaScript變數
- Go 中的動態作用域變數Go變數
- 一起學習JavaScript (4) 之變數、作用域和記憶體問題JavaScript變數記憶體
- 函式(三)作用域之變數作用域、函式巢狀中區域性函式作用域、預設值引數作用域函式變數巢狀
- Python 函式和變數作用域Python函式變數
- Day08-常量、變數、作用域變數
- 變數、作用域與記憶體變數記憶體
- PHP 變數的四大作用域PHP變數
- CSS變數的作用域和預設值CSS變數
- Python閉包區域性變數問題Python變數
- ES6 變數作用域總結變數
- Java基礎06:變數、常量、作用域Java變數
- 語法1-變數、常量、作用域變數
- 11-程式碼塊和變數的作用域變數
- 原型模式故事鏈(5)--JS變數作用域、作用域鏈、閉包原型模式JS變數
- Go基礎知識-02 作用域 常量 變數 作用域(持續更新)Go變數
- 【WPF】 問題總結-RaidButton修改樣式模板後作用區域的變化AI
- 強大的CSS:var變數的區域性作用域(繼承)特性CSS變數繼承
- 迴圈輸出——閉包、變數作用域變數