一直對shell腳本有一種特殊的感覺,因此花了一段時間學習,本人擅長C語言編程,深受C語言荼毒,在學習其他任何類似於編程語言的東東的時候,都會不自覺的與C進行對比,因此對於shell中的變量的作用域一直有點疑問,在此總結一下:
首先,腳本的變量聲明相比於C來說還是比較簡單好用的,跟python有的一拼,沒有那么復雜的用法,直接說明然后使用,無論是字符串還是數字都一樣。但是本着嚴謹的態度,對於變量的聲明和使用,還是希望有需要的時候聲明使用,不需要的時候,立馬舍棄丟掉,一刻不多留,這就需要了解shell中變量的作用域問題。
1、全局變量
在shell中,默認的變量作用域是全局類型的。
1 #!/bin/bash 2 3 declare -i tmp1=10 4 5 function fun1(){ 6 echo $tmp1; 7 tmp2=100; 8 } 9 10 ### START HERE ### 11 fun1 12 13 echo $tmp2
直接上代碼,tmp1這種在函數體外文件內聲明的變量,毫無疑問屬於全局變量,其作用域應從定義的地方開始一直到腳本結束。而tmp2在這里也屬於gloabl變量,其作用域應在第一次調用fun1()函數的地方開始,到腳本結束。
可得:在沒有任何限定說明的情況下,shell默認變量屬於全局類型
2、局部變量
以上述代碼為例,假設第7行tmp2=100,修改為declare -i tmp2=100,最終運行結果將不會輸出tmp2=100,說明函數體內采用declare修飾的變量屬於局部變量,作用域僅限於該函數體內部。
local:顯式聲明某變量為局部變量,函數體內凡是帶有locall修飾的變量,均為局部。(注意:如果局部變量與全局變量同名,則局部會覆蓋全局變量)
3、參數
函數參數為局部類型,只能在當前函數內部使用。