標籤:io 使用 ar for strong 檔案 資料 sp div
函數是被賦予名稱的指令碼代碼塊,可以在代碼的任意位置重用。每當需要在指令碼中使用這樣的代碼塊時,只需引用該代碼塊被賦予的函數名稱。
建立函數
格式
function name {
commands
}
name 屬性定義了該函數的唯一名稱。name 後面要有空格。
name() {
commands
}
樣本
#!/bin/bash
# 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"
注意:如果在函數定義之前使用函數,會得到錯誤訊息。
如果重新定義函數,那麼新定義將取代函數原先的定義。
函數傳回值
預設退出狀態
預設情況下,函數的退出狀態是函數的最後一條命令返回的退出狀態。
樣本
#!/bin/bash
# testing the exit status of a function
func1() {
echo "trying to display a non-existent file"
ls -l badfile
}
echo "testing the function:"
func1
echo "The exit status is: $?"
使用 return 命令
return 命令可以使用單個整數值來定義函數退出狀態,提供了一種通過編程設定函數退出狀態的簡單方法。
樣本
#!/bin/bash
# using the return command in a function
function db1 {
read -p "Enter a value: " value
echo "doubling the value"
return $[ $value * 2]
}
db1
echo "The new value is $?"
注意:請記住在函數完成後儘快提取傳回值
請記住退出狀態的取值範圍是0~255
使用函數輸出
正如命令輸出可以捕獲並存放到 shell 變數中一樣,函數的輸出也可以捕獲並存放到 shell 變數中。
樣本
#!/bin/bash
# using the echo to return a value
function db1 {
read -p "Enter a value: " value
echo $[ ($value) * 2 ]
}
result=`db1`
echo "The new value is $result"
向函數傳遞參數
函數可以使用標準參數環境變數來表示命令列傳遞給函數的參數。
函數名在變數 $0 中定義, 函數命令列的其他參數使用變數 $1、$2...,專有變數$#可以用來確定傳遞給函數的參數數目。
樣本
#!/bin/bash
# passing parameters to a function
function addem {
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=`addem 10 15`
echo $value
echo -n "Let‘s try adding just one number: "
value=`addem 10`
echo $value
echo -n "Now trying adding no numbers: "
value=`addem`
echo $value
echo -n "Finally, try adding three numbers: "
value=`addem 10 15 20`
echo $value
由於函數為自己的參數值使用專用的參數環境變數,所以函數無法從指令碼命令行直接存取指令碼參數值。如果想在函數中使用這些值,那麼必須在調用該函數時手動傳遞這些資料。
樣本
#!/bin/bash
# trying to access script parameters inside a function
function func7 {
echo $[ $1 * $2 ]
}
if [ $# -eq 2 ]
then
value=`func7 $1 $2`
echo "The result is $value"
else
echo "Usage: badtest1 a b"
fi
在函數中使用變數
全域變數是在 shell 指令碼內處處有效變數。
樣本
#!/bin/bash
# using a global variable to pass a value
function db1 {
value=$[ $value * 2 ]
}
read -p "Enter a value: " value
db1
echo "The new value is: $value"
局部變數是在函數內部使用的變數,在變數聲明前面冠以 local 關鍵字。
如果指令碼在函數外部有同名變數,那麼 shell 將能區分開這兩個變數。
樣本
#!/bin/bash
# demonstrating the local keyword
function func1 {
local temp=$[ $value + 5 ]
result=$[ $temp * 2 ]
}
temp=4
value=6
func1
echo "The result is $result"
if [ $temp -gt $value ]
then
echo "temp is larger"
else
echo "temp is smaller"
fi
向函數傳遞數組
如果試圖將陣列變數作為函數參數使用,那麼函數只提取陣列變數的第一個取值。
樣本
#!/bin/sh
# array variable to function test
function testit {
local newarray
newarray=("[email protected]")
echo "The new array value is: ${newarray[*]}"
}
myarray=(1 2 3 4 5)
echo "The original array is ${myarray[*]}"
testit ${myarray[*]}
必須將陣列變數拆分為單個元素,然後使用這些元素的值作為函數參數。
函數內部使用數組
樣本
#!/bin/bash
# adding values in an array
function addarray {
local sum=0
local newarray
newarray=(`echo "[email protected]"`)
for value in ${newarray[*]}
do
sum=$[ $sum + $value ]
done
echo $sum
}
myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
arg1=`echo ${myarray[*]}`
result=`addarray $arg1`
echo "The result is $result"
從函數返回數組
樣本
#!/bin/sh
# returning an array value
function arraydblr {
local origarray
local newarray
local elements
local i
origarray=(`echo "[email protected]"`)
newarray=(`echo "[email protected]"`)
elements=$[ $# - 1 ]
for(( i=0; i<=elements; i++ ))
{
newarray[$i]=$[ ${origarray[$i]} * 2 ]
}
echo ${newarray[*]}
}
myarray=(1 2 3 4 5)
echo "The original array is: ${myarray[*]}"
arg1=`echo ${myarray[*]}`
result=(`arraydblr $arg1`)
echo "The new array is: ${result[*]}"
函數遞迴
樣本
#!/bin/sh
# using recursion
function factorial {
if [ $1 -eq 1 ]
then
echo 1
else
local temp=$[ $1 - 1 ]
local result=`factorial $temp`
echo $[ $1 * $result ]
fi
}
read -p "Enter value: " value
result=`factorial $value`
echo "The factorial of $value is: $result"
建立庫
建立函數的庫檔案,可以在不同指令碼中引用該庫檔案。
其痛點在於 shell 函數的範圍。與環境變數一樣,shell 函數僅在其定義所處的 shell 會話中有效。如果從 shell 命令列介面運行庫檔案,那麼 shell 將開啟一個新的 shell ,並在新 shell 中運行此指令碼,但是當試圖運行調用這些庫函數的另一個指令碼時,庫函數並不能使用。
使用函數庫的關鍵是 source 命令。source 命令在當前 shell 環境中執行命令,而非建立新 shell 來執行命令。使用 source 命令在 shell 指令碼內部運行庫檔案指令碼。
source 有一個短小的別名,稱為點操作符(.)
樣本
#!/bin/bash
# using functions defiend in a library file
. ./myfuncs
value1=10
value2=5
result1=`addem $value1 $value2`
result2=`multem $value1 $value2`
result3=`divem $value1 $value2`
echo "The result of adding them is: $result1"
echo "The result of multiplying them is: $result2"
echo "The result of dividing them is: $result3"
在命令列中使用參數
$ function divem { echo $[ $1 + $2 ]; }
$ divem 100 5
在.bashrc 檔案中定義函數
將函數定義放在 shell 每次啟動都能重新載入的地方,.bashrc。
可以直接定義函數,或者提供函數檔案。
Shell 文法之函數