標籤:shell
函數
案例一:
#!/bin/bash
hello () {
echo "hahahah"
}
hello
執行函數,結果為: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"
執行函數,得到兩個數的和.
案例三:
#!/bin/bash
number_one() {
echo "number_one"
number_two
}
number_two()
{
echo "number_two"
}
number_one
執行命令:[[email protected] tmp]# sh function2.sh
輸出結果:
number_one
number_two
分析:定義shell函數的文法為
[funciton] funname [()]
{
action
[ return int ]
}
說明:
1.可以帶function fun()定義,也可以直接fun()定義,不帶任何參數(關鍵字function可以省略).
2.函數返回,可以顯示的加:return返回,如果不加,將以最後一條命令的運行結果作為返回值.
Shell函數類似於Shell指令碼,裡面存放了一系列的指令,不過Shell的函數存在於記憶體,而不是硬碟檔案,所以速度很快,另外,Shell還能對函數進行預先處理,所以函數的啟動比指令碼更快。
語句部分可以是任意的Shell命令,也可以調用其他的函數。
如果在函數中使用exit命令,可以退出整個指令碼,通常情況,函數結束之後會返回調用函數的部分繼續執行。
可以使用break語句來中斷函數的執行。
declare –f 可以顯示定義的函數清單
declare –F可以只顯示定義的函數名
unset –f 可以從Shell記憶體中刪除函數
export –f將函數輸出給Shell
另外,函數的定義可以放到.bash_profile檔案中,也可以放到使用函數的指令碼中,還可以直接放到命令列中,還可以使用內部的unset命令刪除函數。一旦使用者登出,Shell將不再保持這些函數。
補充一下,就是:
$0:是指令碼本身的名字;
$#:是傳給指令碼的參數個數;
[email protected]:是傳給指令碼的所有參數的列表,即被擴充為"$1" "$2" "$3"等;
$*:是以一個單字串顯示所有向指令碼傳遞的參數,與位置變數不同,參數可超過9個,即被擴充成"$1c$2c$3",其中c是IFS的第一個字元;
$$:是指令碼啟動並執行當前進程ID號;
$?:是顯示最後命令的退出狀態,0表示沒有錯誤,其他表示有錯誤;
舉例說:
指令碼名稱叫test.sh 入參三個: 1 2 3
運行test.sh 1 2 3後
$*為"1 2 3"(一起被引號包住)
[email protected]為"1" "2" "3"(分別被包住)
$#為3(參數數量)
其中exit 是用來結束一個程式的執行的,而return只是用來從一個函數中返回。
exit(0)表示正常退出執行程式,如果加其它的數值:1,2,....可以表示由於不同的錯誤原因而退出 。
那麼,1,2,3怎麼對應不同的原因? --你自己想讓它是什麼意思,它就是什麼意思.
但一般都有常用的、通用的含義:比如 0 一般都表示正常返回、退出。
因此,,在main函數中exit(0)等價於return 0。
全域變數
這種類似與C語言中的全域變數(或環境變數)
案例:
#!/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 $?"輸出時0不好理解,這個是說上一行的mytest這個函數執行成功了,所以值為0,但是在這個函數的內部給全域變數重新賦值.所以結果為:
mytest
args 1
return 0
g_var=1
函數沒有提供局部變數.因此所有的函數都與父指令碼共用變數;即,你必須小心留意不要修改父指令碼裡不期望改變的東西,例如:path.不過這也表示其他狀態是共用的,例如當前木與捕捉訊號.
shell學習三十一天----函數問題