Shell指令碼程式設計之函式
阿新 • • 發佈:2019-01-31
2016/06/10
1. 指令碼中使用函式
建立函式的格式,有兩種:
function name {
commands
}
或
name() {
commands
}
#using a function in a script
function func1 {
echo "This is an example of a function"
}
count=1
while [ $count -le 5 ]
do
func1
count=$[ $count +1 ]
done
echo "This is the end of the loop"
func1
echo "Now this is the end of the script"
2. 函式返回值
使用函式輸出
#!/bin/bash
function func2 {
echo "inside function"
read -p "Enter a value: " value
echo $[$value*2]
}
result=`func2`
echo "The new value is $result"
3.在函式中使用變數
3.1 向函式傳遞引數
函式可以使用標準的引數環境變數來代表命令列上傳給函式的引數,如,函式名會在$0變數中定義,函式命令列的任何引數都會通過$1, $2等定義。也可以用特殊變數$#來判斷傳給函式的引數數目 ,函式可以用引數環境變數獲得引數值。
3.1.1 在指令碼中呼叫函式時傳遞引數,必須將引數和函式放在同一行
#!/bin/bash
function add {
if [ $# -eq 0 ] || [ $# -gt 2 ]
then
echo -1
elif [ $# -eq 1 ]
then
echo $[ $1+$1]
else
echo $[ $1 + $2]
fi
}
echo -n "Adding 10 and 15: "
value=`add 10 15`
echo $value
echo -n "Let's try adding just one number: "
value=`add 10`
echo $value
echo -n "Now trying adding no numbers: "
value=`add`
echo $value
echo -n "Finally,try adding three numbers: "
value=`add 10 15 20`
echo $value
3.1.2 在命令列中傳遞引數給指令碼中的函式
#!/bin/bash
function func3 {
echo $[ $1+$2 ]
}
if [ $# -eq 2 ]
then
value=`func3 $1 $2`
echo "The result is $value"
else
echo "Usage: test2 a b"
fi
3.2 在函式中處理變數
函式會用兩種型別的變數:
A 全域性變數
B 區域性變數
3.2.1 全域性變數
預設情況下,你在指令碼中定義的任何變數都是全域性變數,在函式外定義的變數可在函式內正常訪問
3.2.2 區域性變數
不用在函式中使用全域性變數,函式內部使用的任何變數都可以被宣告成區域性變數。要那麼做時,只要在變數宣告的前面加上local關鍵字就可以了,也可以在給變數賦值時在賦值語句中使用local關鍵字,local關鍵字保證了變數只侷限在該函式中,如果指令碼中在該函式之外有同樣的名字的變數,那麼shell將會保證這兩個變數的值是分離的。
#!/bin/bash
function func4 {
local temp=$[ $value+5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
func4
echo "The result is $value"
if [ $temp -gt $value ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi
4. 建立庫
很容易發現,在單個指令碼中,使用函式可以省去一些鍵入的工作,但如果你碰巧要在指令碼之間使用同一個程式碼塊呢?顯然,在每個指令碼中都定義一個同樣的函式會比較麻煩。有個方法能解決這個問題,bash shell允許建立函式庫檔案,然後在需要時在多個檔案中引用該庫檔案。這個過程的第一步時建立一個包含指令碼中所需函式的共用庫檔案,如:
/home/zh/work_space/scripts/function/myfuncs
function add {
echo $[ $1+$2 ]
}
function mult {
echo $[ $1 * $2 ]
}
function div {
if [ $2 -ne 0 ]
then
echo $[ $1 /$2 ]
else
echo -1
fi
}
使用函式庫到關鍵在於source 命令,source命令會在當前的shell上下文中執行命令,而不是建立一個新的shell來執行命令。可以用source命令
來在shell指令碼中執行庫檔案指令碼,這樣函式就對指令碼可用了。source命令有個快捷別名,稱作點操作符(dot operator) ,要在shell 指令碼中執行myfuncs庫檔案,你只需要新增下面這行:
. ./myfuncs
#!/bin/bash
. ./myfuncs
value1=50
value2=10
result1=`add $value1 $value2`
result2=`mult $value1 $value2`
result3=`div $value1 $value2`
echo "The result of add: $result1"
echo "The result of mult: $result2"
echo "The result of div: $result3"
5. 在.bashrc檔案中定義函式
bash shell會在每次啟動時在主目錄查詢這個檔案,不管是互動式的還是從現有shell中啟動一個新的shell
5.1 直接定義函式
5.2 讀取庫檔案指令碼
/home/zh/work_space/scripts/function/myfuncs
function add {
echo $[ $1+$2 ]
}
function mult {
echo $[ $1 * $2 ]
}
function div {
if [ $2 -ne 0 ]
then
echo $[ $1 /$2 ]
else
echo -1
fi
}
看看效果:
更好的一點是,shell還會將定義好的函式傳給子shell程序,這樣這些函式會在該shell會話中的任何指令碼中也都可以用,如:
#!/bin/bash
value1=50
value2=10
result1=`add $value1 $value2`
result2=`mult $value1 $value2`
result3=`div $value1 $value2`
echo "The result of add: $result1"
echo "The result of mult: $result2"
echo "The result of div: $result3"
結束!