在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中指令碼變數和函式變數的作用域
在shell中定義函式可以使 模組化,便於復用 不過指令碼本身的變數和函式的變數的作用域問題可能令你費解,在這裡梳理一下這個問題。1 shell指令碼中定義的變數是global的,其作用域從被定義的地方開始,到shell結束或被顯示刪除的地方為止。例1 指令碼變數的作用域 bin bash defi...
Shell中指令碼變數和函式變數的作用域
shell中指令碼變數和函式變數的作用域 在shell中定義函式可以使 模組化,便於復用 不過指令碼本身的變數和函式 的變數的作用域問題可能令你費解,在這裡梳理一下這個問題。1 shell指令碼中定義的變數是global的,其作用域從被定義的地方開始,到shell結束或 被顯示刪除的地方為止。例1 ...
shell指令碼(變數)
1 定義及賦值 格式 變數名 變數值 等號兩邊沒有空格 2 引用 檢視 變數 格式 變數名 例 title shaodianlingxing echo title 輸出 shaodianlingxing 3 雙引號 功能 允許引用 轉義 例如 echo title group 輸出 shaodian...