shell指令碼中區域性變數

2022-07-30 00:09:22 字數 1819 閱讀 9632

在shell中定義函式可以使**模組化,便於復用**。不過指令碼本身的變數和函式的變數的作用域問題可能令你費解,在這裡梳理一下這個問題。

(1)shell指令碼中定義的變數是global的,其作用域從被定義的地方開始,到shell結束或被顯示刪除的地方為止。

例1:指令碼變數的作用域

#!/bin/bash

#define the function ltx_func

ltx_func()

#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的。

例2:函式定義的global變數

#!/bin/bash

#define the function ltx_func

ltx_func()

#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()

#call the function ltx_func

ltx_func

echo $v2

結果:(空)

解析:函式變數v2顯示定義為local的,其作用域侷限於函式內。列印命令在函式外,不在變數v2的作用域內,所以能夠不能訪問變數v2。

例4:函式引數是local變數

#!/bin/bash

#define the function ltx_func

ltx_func()

#call the function ltx_func

ltx_func 100

結果:100

解析:函式引數是local的,通過位置變數來訪問。列印命令輸出函式的第乙個引數。

(3)如果同名,shell函式定義的local變數會遮蔽指令碼定義的global變數。

例5:同名local變數遮蔽global變數

#!/bin/bash

#define the function ltx_func

ltx_func()

#define the global variable v1

v1=100

#call the function ltx_func

ltx_func

echo $v1

結果:100

200100

解析:global變數v1的作用域從被定義的地方開始,到shell結束。呼叫函式ltx_func的地方在變數v1的作用域內,所以能夠變數v1。函式又定義了同名的local變數v1,同名local變數遮蔽global變數,所以函式第二次列印訪問的是local變數。退出函式後再次列印v1,此時函式定義的local變數已經消失,訪問的是global變數。

shell中區域性變數及local命令

local一般用於區域性變數宣告,多在在函式內部使用。1 shell指令碼中定義的變數是global的,其作用域從被定義的地方開始,到shell結束或被顯示刪除的地方為止。2 shell函式定義的變數預設是global的,其作用域從 函式被呼叫時執行變數定義的地方 開始,到shell結束或被顯示刪除...

函式中區域性變數的返回

一般說來,函式中是可以進行區域性變數的返回的,不然豈不是全部要用全域性變數,如果使用了全域性變數,那還有必要進行返回嗎?那函式就沒有它存在的意義了!但是要注意了,這裡所謂的區域性變數的返回很有內涵,什麼樣的值才可以進行返回而不出錯?其實,只要遵守一句話即可 函式不能返回指向棧記憶體的指標!為什麼?因...

RAM中區域性變數在棧中分配

無os時,ram的使用可以分為資料 棧和堆區域 有os時,將ram分成若干個段,每個任務分配乙個段,用於各自的資料 棧和堆區域。區域性變數 local variable 是指作用域和生命週期都侷限在所在函式或過程範圍內的變數,它是相對於全域性變數 global variable 而言的。編譯器在為區...