1.函數(shù)的定義和語法
函數(shù)由兩部分組成:函數(shù)名和函數(shù)體
語法一:
f_name (){
...函數(shù)體...
} ?
語法二:
function f_name {
...函數(shù)體...
} ?
語法三:
function f_name () {
...函數(shù)體...
}?
2.函數(shù)調(diào)用
調(diào)用:函數(shù)只有被調(diào)用才會執(zhí)行
調(diào)用:給定函數(shù)名
函數(shù)名出現(xiàn)的地方,會被自動替換為函數(shù)代碼
函數(shù)的生命周期:被調(diào)用時創(chuàng)建,返回時終止
3.函數(shù)返回值
函數(shù)有兩種返回值:
函數(shù)的執(zhí)行結(jié)果返回值:
(1) 使用echo等命令進行輸出
(2) 函數(shù)體中調(diào)用命令的輸出結(jié)果
函數(shù)的退出狀態(tài)碼:
(1) 函數(shù)的返回值默認取決于函數(shù)中執(zhí)行的最后一條命令的退出狀態(tài)碼,返回0或非0(0-255)
(2) 自定義退出狀態(tài)碼,其格式為:
return 從函數(shù)中返回,用最后狀態(tài)命令決定返回值
return 0 無錯誤返回。
return 1-255 有錯誤返回
函數(shù)需要返回任意值,需要用echo
return的返回值缺陷
可自定義函數(shù)返回值,使用return
return 返回值范圍0-255,只能返回數(shù)值,如果值大于255,返回值不正確。
而且無法返回浮點數(shù),字符串。
示例1:
#!/usr/bin/bash
fun2(){
read -p "enter num:" num
let $[2*$num]
}
fun2
shell> bash fun3.sh
enter num:2
示例1,函數(shù)執(zhí)行后沒有任何返回值
示例2:
#!/usr/bin/bash
fun2(){
read -p "enter num:" num
let $[2*$num]
}
fun2
echo "fun2 return value: $?"
[root@localhost shell]# bash fun3.sh
enter num:2
fun2 return value: 0
示例2,函數(shù)執(zhí)行后使用$?獲取返回值,默認取決于函數(shù)中執(zhí)行的最后一條命令的退出狀態(tài)碼,返回0或非0(0-255之間的數(shù)字)
示例3:
#!/usr/bin/bash
fun2(){
read -p "enter num:" num
return $[2*$num] #return后面不能使用表達式,只是數(shù)值
}
fun2
echo "fun2 return value: $?"
[root@localhost shell]# bash fun3.sh
enter num:2
fun2 return value: 4
[root@localhost shell]# bash fun3.sh
enter num:200
fun2 return value: 144 #返回結(jié)果錯誤,因為return返回最大值255
示例3,說明使用return返回值最大為255,超過或返回值為字符串則結(jié)果錯誤
示例4:
#!/usr/bin/bash
fun2(){
read -p "enter num:" num
echo $[2*$num]
}
fun2
result=`fun2` #可以使用一個變量來接收一個函數(shù)的輸出
[root@localhost shell]# bash fun3.sh
enter num:200
400
示例4,使用 echo進行輸出,echo可以返回任意值。
4.函數(shù)傳參-位置參數(shù)
#!/usr/bin/bash
if [ $# -ne 3 ];then
echo "usage: `basename $0` par1 par2 par3"
exit
fi
fun4(){
echo "$(($1 * $2 * $3))"
}
#result=`fun4 1 2 3` #函數(shù)傳參
result=`fun4 $1 $2 $3` #函數(shù)傳參,關(guān)聯(lián)腳本的位置傳參
echo "result is: $result"
[root@localhost shell]# bash fun4.sh 1 2 3
result is: 6
可以直接給函數(shù)傳參,也可以關(guān)聯(lián)腳本的位置傳參,上面的執(zhí)行已關(guān)聯(lián)腳本的位置傳參。
5.函數(shù)傳參-數(shù)組
#!/usr/bin/bash
num=(1 2 3 4 5)
#echo "${num[@]}"
arrary(){
factorial=1
for i in "$@" #使用$@接收所有參數(shù)
do
factorial=$[factorial * $i]
done
echo "$factorial"
}
arrary ${num[*]}
[root@localhost shell]# bash fun5.sh
120
6.函數(shù)返回-輸出數(shù)組變量
示例1
#!/usr/bin/bash
num=(1 2 3)
array(){
local newarray=(`echo $*`)
local outarray=()
local i
for((i=0;i<$#;i++))
do
outarray[$i]=$(( ${newarray[$i]} * 5 ))
done
echo "${outarray[*]}"
}
result=`array ${num[*]}`
echo ${result[*]}
[root@localhost shell]# bash fun6.sh
5 10 15
示例2
#!/usr/bin/bash
num=(1 2 3)
array() {
local i
local outarray=()
# for i in $*
for i #這種模式代表傳遞所有參數(shù)
do
outarray[j++]=$[$i*5]
done
echo "${outarray[*]}"
}
result=`array ${num[*]}` #使用反引號會在子shell中執(zhí)行
echo ${result[*]}
#函數(shù)接收位置參數(shù) $1 $2 $3 ... $n
#函數(shù)接收數(shù)組變量 $* 或 $@
#函數(shù)使用參數(shù)的個數(shù) $#
#函數(shù)將接收到的所有參數(shù) 賦值給新數(shù)組 newarray=($*)
[root@localhost shell]# bash fun7.sh
5 10 15
7.預(yù)定義變量說明
**預(yù)定義變量說明**
$0 腳本名
$* 所有的參數(shù)
$@ 所有的參數(shù)
$# 參數(shù)的個數(shù)
$$ 當前進程的PID
$! 上一個后臺進程的PID
$? 上一個命令的返回值0表示成功