1. 程式人生 > >Shell中指令碼變數的作用域

Shell中指令碼變數的作用域

轉自:http://www.2cto.com/os/201301/182260.html

在shell中定義函式可以使程式碼模組化,便於複用程式碼。不過指令碼本身的變數和函式
的變數的作用域問題可能令你費解,在這裡梳理一下這個問題。 (1)Shell指令碼中定義的變數是global的,其作用域從被定義的地方開始,到shell結束或
被顯示刪除的地方為止。 例1:指令碼變數的作用域 #!/bin/bash #define the function ltx_func ltx_func() {    echo $v1    #modify the variable v1    v1=200  } #define the variable v1 v1=100 #call the function ltx_func ltx_func echo $v1 結果: 100 200 解析:指令碼變數v1的作用域從被定義的地方開始,到shell結束。呼叫函式ltx_func的地方在變數v1的作用域內,所以能夠訪問並修改變數v1。 (2)Shell函式定義的變數預設是global的,其作用域從“函式被呼叫時執行變數定義的地方”開始,到shell結束或被顯示刪除處為止。函式定義的變數可以被顯示定義成local的,其作用域侷限於函式內。但請注意,函式的引數是local的。 此處跟js有點像,在js中,在一個function裡面定義變數,如果加上var則是local的,shell中的local關鍵字就相當於js的var,js中如果不加var,直接定義則是全域性的,shell也是。
例2:函式定義的global變數 #!/bin/bash #define the function ltx_func ltx_func() {    #define the variable v2    v2=200  } #call the function ltx_func ltx_func echo $v2 結果: 200 解析:函式變數v2預設是global的,其作用域從“函式被呼叫時執行變數定義的地方”開始,到shell結束為止。注意,不是從定義函式的地方開始,而是從呼叫函式的地方開始。列印命令在變數v2的作用域內,所以能夠訪問變數v2。 例3:函式定義的local變數 #!/bin/bash #define the function ltx_func ltx_func() {    #define the local variable v2    local v2=200  } #call the function ltx_func ltx_func echo $v2 結果: (空) 解析:函式變數v2顯示定義為local的,其作用域侷限於函式內。列印命令在函式外,不在變數v2的作用域內,所以能夠不能訪問變數v2。 例4:函式引數是local變數 #!/bin/bash #define the function ltx_func ltx_func() {    echo "param 1: $1" } #call the function ltx_func ltx_func 100 結果:  www.2cto.com   100 解析:函式引數是local的,通過位置變數來訪問。列印命令輸出函式的第一個引數。 (3)如果同名,Shell函式定義的local變數會遮蔽指令碼定義的global變數。 例5:同名local變數遮蔽global變數 #!/bin/bash #define the function ltx_func ltx_func() {    echo $v1    #define the local variable v1    local v1=200     echo $v1 } #define the global variable v1 v1=200  #call the function ltx_func ltx_func echo $v1 結果: 100 200 100 解析:global變數v1的作用域從被定義的地方開始,到shell結束。呼叫函式ltx_func的地方在變數v1的作用域內,所以能夠變數v1。函式又定義了同名的local變數v1,同名local變數遮蔽global變數,所以函式第二次列印訪問的是local變數。退出函式後再次列印v1,此時函式定義的local變數已經消失,訪問的是global變數。

相關推薦

Shell指令碼變數作用

轉自:http://www.2cto.com/os/201301/182260.html 在shell中定義函式可以使程式碼模組化,便於複用程式碼。不過指令碼本身的變數和函式 的變數的作用域問題可能令你費解,在這裡梳理一下這個問題。 (1)Shell指令碼中定義的

Python變數作用,LEGB規則和閉包原理

問題來源   最近看到了一個python程式題,就三行程式碼,卻思考了很久才考慮明白,決定分享一下。 def num(): return [lambda x:i*x for i in range(4)] print([m(2) for m in num()]) 預計結果為:0, 2

Python變數作用與名稱空間(LEGB)

Python 使⽤LEGB的順序來查詢⼀個符號對應的物件locals    ->   enclosing    function    ->   globals    ->    builtins區域性變數———閉包空間———全域性變數———內建模組a =

深入理解JS變數作用

文章轉載http://blog.csdn.net/beijiguangyong/article/details/8301707點選開啟連結 在JS當中一個變數的作用域(scope)是程式中定義這個變數的區域。變數分為兩類:全域性(global)的和區域性的。其中全域性變數的

JS變數作用

作用域說明:指一個變數的作用範圍1.全域性作用域(1) 全域性作用域在頁面開啟時被建立,頁面關閉時被銷燬(2) 編寫在script標籤中的變數和函式,作用域為全域性,在頁面的任意位置都可以訪問到(3) 在全域性作用域中有全域性物件window,代表一個瀏覽器視窗,由瀏覽器建立

shell變數作用

#shell指令碼如下: #!/bin/bash count=1 cat datafile.txt | while myline=$(line) do echo "LINE:"$myline count=$[$count + 1] #count=`expr $count + 1` #ech

關於C語言變數作用的個人心得

    這是本人的第一篇部落格,內容簡單總結淺陋。但這會是我寫部落格的開始,好啦!廢話不多說。。。。     學過C語言的同學可能都知道,在C中變數都具有作用域的說法。以下是標準的解釋和案例:    &

python包,模組,函式,與變數作用

python 專案的組織結構(最頂級的組織結構) 最頂級的是包,其次是模組,類,然後是函式、變數。 區分不同的模組前面加上包的名字:one.c1,two.c1(包.模組) 包下面可以有子包,也可以有模組 資料夾要變成一個包,要有一個__init__.py檔案(也是一個

【SQL】小心在迴圈宣告變數——淺析SQL變數作用

本文適用:T-SQL(SQL Server) 先看這個語句: DECLARE @i INT = 0 WHILE @i < 3 --跑3圈 BEGIN --每圈都定義一個表變數,並插入一行 DECLARE @t TABLE(Col INT PRIMARY KEY) --主

深入理解JavaScript變數作用

理解JavaScript變數作用域: ------------------ 變數作用域又叫做變數的可見性。在JavaScript中,變數的作用域是由函式限定的,它們要麼是全域性的,要麼是區域性的。·顧

C/C++語言變數作用:區域性變數,全域性變數,檔案級變數

C/C++語言中的變數分為全域性變數和區域性變數。這種劃分方式的依據是變數的可見範圍或者叫做作用域。 1 區域性變數 區域性變數指的是定義在{}中的變數,其作用域也在這個範圍內。雖然常見的區域性變數都是定義在函式體內的,也完全可以人為的增加一對大括號來限定變

linux shell 自定義函式(定義、返回值、變數作用)介紹

inux shell 可以使用者定義函式,然後在shell指令碼中可以隨便呼叫。下面說說它的定義方法,以及呼叫需要注意那些事項。 一、定義shell函式(define function) 語法: [ function ] funname [()] {     act

JSfor迴圈變數作用

js中作用域只有函式作用域和全域性作用域,在函式體內使用var 定義的變數,會被提到函式開始處進行定義,作用域為整個函式,常見的誤區如下 var a=[]; for(var i = 0;i<10;i++){ var q = i; a[i]=funct

Shell指令碼(三)-Shell變數、函式及read命令

在Shell指令碼中,通常需要在Shell命令使用其他資料來處理資訊。這就需要使用變數來實現,變數可以將資訊臨時儲存在Shell執行環境中,以便和指令碼中的其他命令一起使用。變數的型別系統變數:系統變數通常寫在/etc/profile或/etc/profile.d中,對所有使

HTML的函式使用基礎(函式定義,函式呼叫,函式引數,函式返回值,巢狀函式,遞迴函式,變數作用,內建函式,其他定義函式的方法)

HTML中的函式使用基礎 函式實質上是一個類似於單獨的邏輯單元的JavaScript程式碼,使用函式可以使程式碼更為簡潔,提供重用性,在JavaScript中,大約有95以上的程式碼是包含在函式中的,由此可見,函式在JavaScript中地位相當重要。 1、函式定義 在

Jsarguments的使用、函式自呼叫、變數作用、函式作為引數傳入、函式作為返回值

1,arguments是一個比較特別的物件,每個函式中都有一個arguments,它接收函式傳入的引數,以陣列的形式存放在 arguments,可遍歷 //1,需求:求任意數的最大值 function getMax(){ var Max = arguments

Go 的動態作用變數

這是一個 API 設計的思想實驗,它從典型的 Go 單元測試慣用形式開始: ```go func TestOpenFile(t *testing.T) { f, err := os.Open("notfound") if err != nil {

HTML5 | Canvas變量作用與setInterval()方法的影響

通過 value utf 出現 close span arc shadow cli Demo - 隨機繪制圓環 實現思路: 將一個圓環的繪制分成100份,setInterval()方法定義每隔時間n繪制一段新的,每份的開始路徑都是上一次的結束路徑,實現步進繪制。 通

vba變量作用

標準 運行 ring ref cin box http stat 打開 參考:http://club.excelhome.net/thread-1237085-1-1.html 全局變量例子public 變量1 AS IntegerSub LLL()變量1 =

JS高級程序設計對“私有作用”的經典解釋

js高級程序設計 mef size 替換 沒有 color 包含 函數 16px JavaScript從來不會告訴你是否多次聲明了同一個變量;遇到這種情況,它只會對後續的聲明視而不 見(不過,它會執行後續聲明中的變量初始化)。 匿名函數可以用來模仿塊級作用域並避免這個問題。