先回顧一下別名的做用mysql
[root@shellbiancheng ~]# alias httpd='/etc/init.d/httpd' [root@shellbiancheng ~]# httpd start 正在啓動 httpd: [肯定]
函數的做用就是把程序裏屢次調用相同的代碼部分定義成一份而後爲這一份代碼起一個名字,其餘全部的重複調用這部分代碼就都只調用這個名字就能夠了,當須要修改這部分重複代碼時,只需修改函數體內的一份代碼便可實現全部調用修改。linux
使用函數的優點:web
(1)把相同的程序段定義成函數,能夠減小整個程序的代碼量。sql
(2)增長程序的可讀性,易讀性。shell
(3)能夠實現程序功能模塊化,不一樣的程序使用函數模塊化。編程
注意:linux系統的2000個命令均可以說是shell腳本的函數。bash
簡單語法格式(推薦使用):ide
函數名(){ 指令… return n }
規範語法格式:模塊化
function 函數名(){ 指令… return n }
提示:shell的返回值是exit輸出返回值,函數裏用return輸出返回值函數
調用函數:
(1)直接調用函數名便可不用帶括號
注意:
a.調用函數時,函數後的小括號不須要帶。
b.函數定義及函數體必須在要執行的函數名前面定義,shell的執行是從上到下按行執行的。
(2)函數的傳參
函數的傳參和腳本的傳參相似,只是腳本名換成函數名便可。
函數名 參數1 參數2
函數後接的參數說明:
a.Shell的位置參數($一、$二、$三、$四、$五、$#、$*、$?、$@)均可以是函數的參數。
b.此時父腳本的參數臨時地被函數參數所掩蓋或隱藏。
c.$0比較特殊,它也表明父腳本的名稱。
d.當函數完成時,原來的命令行腳本的參數便可恢復。
e.在shell函數裏面,return命令功能與shell裏exit相似,做用是跳出函數。
f.return語句會返回一個退出值(返回值)給調用函數的程序。
g.函數的參數變量是函數體裏面定義的,若是是普通變量通常會使用local,好比說定義一個a就用local a 來定義。
範例1:開發腳本創建兩個簡單的函數並調用執行
[root@shellbiancheng jiaobenlianxi]# cat hanshu01.sh #/bin/bash nishishei(){ echo "who are you?" } function linzhongniao(){ echo "I am linzhongniao" } nishishei linzhongniao
執行
[root@shellbiancheng jiaobenlianxi]# sh hanshu01.sh who are you? I am linzhongniao
若是咱們調用的函數在開發的每個腳本中都要調用能夠將函數寫到/etc/init.d/functions裏面,這裏爲了方便看清用source執行腳本,也能夠用點號「.」。
[root@shellbiancheng jiaobenlianxi]# tail -5 /etc/init.d/functions } linzhongniao(){ echo "I am linzhongniao" } [root@shellbiancheng jiaobenlianxi]# cat hanshu02.sh #/bin/bash source /etc/init.d/functions nishishei(){ echo "who are you?" } nishishei linzhongniao [root@shellbiancheng jiaobenlianxi]# sh hanshu02.sh who are you? I am linzhongniao
範例2:函數傳參轉成腳本傳參命令行參數,對任意指定URL判斷是否正常。固然也能夠判斷服務,好比mysql 、httpd等方法相似這裏就不說了,前面分支循環結構有判斷服務的例子。
分步解答:
a.腳本傳參檢查web url是否正常。
b.檢查的功能寫成函數。
c.函數傳參轉換成腳本命令行傳參,對任意指定URL判斷是否異常。
[root@shellbiancheng jiaobenlianxi]# cat check_url.sh #!/bin/bash [ -f /etc/init.d/functions ]&& . /etc/init.d/functions usage(){ #usage給用戶一個提示 echo $"Usage: $0 url" exit 1 } RETVAL=0 CheckUrl(){ wget -T 10 --spider -t 2 $1 &>/dev/null jieguo=$? if [ $jieguo -eq 0 ];then action "$1 url" /bin/true else action "$1 url" /bin/false fi return $RETVAL } main(){ if [ $# -ne 1 ];then 判斷參數輸入參數的個數,若是不等於1執行usage函數 usage fi CheckUrl $1 jieguo=$? Return $jieguo } main $* $*這裏的做用是無論敲多少個參數都當成一個,防止亂輸入別的東西
執行結果:
[root@shellbiancheng jiaobenlianxi]# sh check_url.sh www.baidu.com www.baidu.com url [肯定] [root@shellbiancheng jiaobenlianxi]# sh check_url.sh www.sss.com www.sss.com url[失敗]
範例3:給字符串加顏色的傳參例子
用if方式實現給字符串加顏色,輸出顏色要用echo –e
對反斜槓轉義。SHAN='\E[31;5m'和RES='\E[0m'
對內容高亮閃爍提示。
[root@shellbiancheng jiaobenlianxi]# cat color.sh #!/bin/bash RED_COLOR='\E[1;31m' GREEN_COLOR='\E[1;32m' YELLOW_COLOR='\E[1;33m' BLUE_COLOR='\E[1;34m' PINK='\E[1;35m' SHAN='\E[31;5m' #提示閃爍,配合echo –e 使用 RES='\E[0m' usage(){ echo -e ${SHAN} "Usage: $0{red|green|yellow|pink}" contents ${RES} exit 1 } color(){ if [ "$1" = "red" ];then echo -e "${RED_COLOR} $2 $RES" elif [ "$1" = "green" ];then echo -e "${GREEN_COLOR} $2 $RES" elif [ "$1" = "yellow" ];then echo -e "${YELLOW_COLOR} $2 $RES" elif [ "$1" = "blue" ];then echo -e "${BLUE_COLOR} $2 $RES" else usage fi } main(){ if [ $# -ne 2 ];then usage fi color $1 $2 } main $*
[root@shellbiancheng jiaobenlianxi]# cat color1.sh #!/bin/bash echo -e "\033[30m 黑色字 I am linzhongniao \033[0m" echo -e "\033[31m 紅色字 I am linzhongniao \033[0m" echo -e "\033[32m 綠色字 I am linzhongniao \033[0m" echo -e "\033[33m 黃顏色字 I am linzhongniao \033[0m" echo -e "\033[34m 藍色字 I am linzhongniao \033[0m" echo -e "\033[35m 紫色字 I am linzhongniao \033[0m" echo -e "\033[36m 天藍字 I am linzhongniao \033[0m" echo -e "\033[37m 白色字 I am linzhongniao \033[0m"
執行結果
[root@shellbiancheng jiaobenlianxi]# cat beijingcolor.sh #!/bin/bash echo -e "\033[40;37m 黑底白字 I am linzhongniao \033[0m" echo -e "\033[41;37m 紅底白字 I am linzhongniao \033[0m" echo -e "\033[42;37m 綠底白字 I am linzhongniao \033[0m" echo -e "\033[43;37m 黃底白字 I am linzhongniao \033[0m" echo -e "\033[44;37m 藍底白字 I am linzhongniao \033[0m" echo -e "\033[45;37m 紫底白字 I am linzhongniao \033[0m" echo -e "\033[46;37m 天藍白字 I am linzhongniao \033[0m" echo -e "\033[47;30m 白底黑字 I am linzhongniao \033[0m"
執行結果: