案例一:
\#!/bin/bash
hello () {
echo "hahahah"
}
hello
執(zhí)行函數(shù),結(jié)果為:hahaha
案例二:
\#!/bin/bash
funWithReturn()
{
echo "the function is to get the sum of two number"
read -p "input first number" num1
read -p "input second number" num2
echo "the two number are $num1 and $num2 !"
return $(($num1+$num2))
}
\
funWithReturn
ret=$?
echo "sum = $ret"
執(zhí)行函數(shù),得到兩個(gè)數(shù)的和。
案例三:
\#!/bin/bash
number_one() {
echo "number_one"
number_two
}
\
number_two()
{
echo "number_two"
}
number_one
執(zhí)行命令:[root@localhost tmp]# sh function2.sh
輸出結(jié)果:
number_one
number_two
分析:定義 shell 函數(shù)的語(yǔ)法為
[funciton] funname [()]
{
action
[return int]
}
說(shuō)明:
Shell 函數(shù)類(lèi)似于 Shell 腳本,里面存放了一系列的指令,不過(guò) Shell 的函數(shù)存在于內(nèi)存,而不是硬盤(pán)文件,所以速度很快,另外,Shell 還能對(duì)函數(shù)進(jìn)行預(yù)處理,所以函數(shù)的啟動(dòng)比腳本更快。
語(yǔ)句部分可以是任意的 Shell 命令,也可以調(diào)用其他的函數(shù)。如果在函數(shù)中使用 exit 命令,可以退出整個(gè)腳本,通常情況,函數(shù)結(jié)束之后會(huì)返回調(diào)用函數(shù)的部分繼續(xù)執(zhí)行??梢允褂?break 語(yǔ)句來(lái)中斷函數(shù)的執(zhí)行。
declare –f
可以顯示定義的函數(shù)清單declare –F
可以只顯示定義的函數(shù)名unset –f
可以從 Shell 內(nèi)存中刪除函數(shù)export –f
將函數(shù)輸出給 Shell另外,函數(shù)的定義可以放到.bash_profile
文件中,也可以放到使用函數(shù)的腳本中,還可以直接放到命令行中,還可以使用內(nèi)部的 unset 命令
刪除函數(shù)。一旦用戶(hù)注銷(xiāo),Shell 將不再保持這些函數(shù)。
補(bǔ)充一下,就是:
$0
:是腳本本身的名字;$#
:是傳給腳本的參數(shù)個(gè)數(shù);$@
:是傳給腳本的所有參數(shù)的列表,即被擴(kuò)展為 "$1"
"$2"
"$3"
等;$*
:是以一個(gè)單字符串顯示所有向腳本傳遞的參數(shù),與位置變量不同,參數(shù)可超過(guò) 9 個(gè),即被擴(kuò)展成 "$1c$2c$3"
,其中 c
是 IFS
的第一個(gè)字符;$$
:是腳本運(yùn)行的當(dāng)前進(jìn)程 ID 號(hào);$?
:是顯示最后命令的退出狀態(tài),0 表示沒(méi)有錯(cuò)誤,其他表示有錯(cuò)誤;舉例說(shuō):
腳本名稱(chēng)叫 test.sh
入?yún)⑷齻€(gè): 1 2 3
運(yùn)行 test.sh 1 2 3
后
$*
為 "1 2 3"(一起被引號(hào)包住)$@
為 "1" "2" "3"(分別被包?。?/li>
$#
為 3(參數(shù)數(shù)量)其中 exit 是用來(lái)結(jié)束一個(gè)程序的執(zhí)行的,而 return 只是用來(lái)從一個(gè)函數(shù)中返回。exit(0) 表示正常退出執(zhí)行程序,如果加其它的數(shù)值:1,2,.... 可以表示由于不同的錯(cuò)誤原因而退出。那么,1,2,3 怎么對(duì)應(yīng)不同的原因? --你自己想讓它是什么意思,它就是什么意思。但一般都有常用的、通用的含義:比如 0 一般都表示正常返回、退出。因此,在 main 函數(shù)中 exit(0)
等價(jià)于 return 0
。
全局變量
這種類(lèi)似與 C 語(yǔ)言中的全局變量 (或環(huán)境變量)
案例:
\#!/bin/bash
g_var=
function mytest()
{
echo "mytest"
echo "args $1"
g_var=$1
return 0
}
mytest 1
echo "return $?"
\
echo
echo "g_var=$g_var"
分析: 主要是 echo "return $?"
輸出時(shí) 0 不好理解,這個(gè)是說(shuō)上一行的 mytest 這個(gè)函數(shù)執(zhí)行成功了,所以值為 0,但是在這個(gè)函數(shù)的內(nèi)部給全局變量重新賦值。所以結(jié)果為:
mytest
args 1
return 0
g_var=1
函數(shù)沒(méi)有提供局部變量。因此所有的函數(shù)都與父腳本共享變量;即,你必須小心留意不要修改父腳本里不期望改變的東西,例如:path。不過(guò)這也表示其他狀態(tài)是共享的,例如當(dāng)前木與捕捉信號(hào)。