shell腳本編程學習之路-函數

1.為什麼要使用函數

先回顧一下別名的作用

<code>[root@shellbiancheng ~]# alias httpd='/etc/init.d/httpd'
[root@shellbiancheng ~]# httpd start/<code>

正在啟動 httpd: [確定]

函數的作用就是把程序裡多次調用相同的代碼部分定義成一份然後為這一份代碼起一個名字,其他所有的重複調用這部分代碼就都只調用這個名字就可以了,當需要修改這部分重複代碼時,只需修改函數體內的一份代碼即可實現所有調用修改。

使用函數的優勢:

(1)把相同的程序段定義成函數,可以減少整個程序的代碼量。

(2)增加程序的可讀性,易讀性。

(3)可以實現程序功能模塊化,不同的程序使用函數模塊化。

注意:linux系統的2000個命令都可以說是shell腳本的函數。

2.Shell函數的語法

簡單語法格式(推薦使用):

<code>函數名(){/<code>
<code>指令…/<code> 
<code>return n/<code>
<code>}/<code>

規範語法格式:

<code>function 函數名(){/<code>
<code>指令…/<code>
<code>return n/<code>
<code>}/<code>

提示:shell的返回值是exit輸出返回值,函數里用return輸出返回值

3.Shell函數的執行

調用函數:

(1)直接調用函數名即可不用帶括號

注意:

a.調用函數時,函數後的小括號不需要帶。

b.函數定義及函數體必須在要執行的函數名前面定義,shell的執行是從上到下按行執行的。

(2)函數的傳參

函數的傳參和腳本的傳參類似,只是腳本名換成函數名即可。

函數名 參數1 參數2

函數後接的參數說明:

a.Shell的位置參數($1、$2、$3、$4、$5、$#、$*、$?、$@)都可以是函數的參數。

b.此時父腳本的參數臨時地被函數參數所掩蓋或隱藏。

c.$0比較特殊,它也代表父腳本的名稱。

d.當函數完成時,原來的命令行腳本的參數即可恢復。

e.在shell函數里面,return命令功能與shell裡exit類似,作用是跳出函數。

f.return語句會返回一個退出值(返回值)給調用函數的程序。

g.函數的參數變量是函數體裡面定義的,如果是普通變量一般會使用local,比如說定義一個a就用local a 來定義。

4.Shell函數範例

4.1 範例1:開發腳本建立兩個簡單的函數並調用執行

<code>[root@shellbiancheng jiaobenlianxi]# cat hanshu01.sh 
#/bin/bash
nishishei(){
    echo "who are you?"
}
 
function linzhongniao(){
    echo "I am linzhongniao"

 
}
nishishei
linzhongniao/<code>

執行

<code>[root@shellbiancheng jiaobenlianxi]# sh hanshu01.sh 
who are you?
I am linzhongniao/<code>

如果我們調用的函數在開發的每一個腳本中都要調用可以將函數寫到/etc/init.d/functions裡面,這裡為了方便看清用source執行腳本,也可以用點號“.”。

<code>[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/<code>

4.2 範例2:

函數傳參轉成腳本傳參命令行參數,對任意指定URL判斷是否正常。當然也可以判斷服務,比如mysql 、httpd等方法類似這裡就不說了,前面分支循環結構有判斷服務的例子。

分步解答:

a.腳本傳參檢查web url是否正常。

b.檢查的功能寫成函數。

c.函數傳參轉換成腳本命令行傳參,對任意指定URL判斷是否異常。

<code>[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 $*    $*這裡的作用是不管敲多少個參數都當成一個,防止亂輸入別的東西/<code>

執行結果:

<code>[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[失敗]/<code>

4.3 範例3:給字符串加顏色的傳參例子

用if方式實現給字符串加顏色,輸出顏色要用echo –e對反斜槓轉義。SHAN='\\E[31;5m'和RES='\\E[0m'對內容高亮閃爍提示。

<code>[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 $*/<code>

5.拓展:

5.1直接加顏色

<code>[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"/<code>

執行結果


shell腳本編程學習之路-函數

5.2字背景顏色範圍40---47

<code>[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"/<code>

執行結果:


shell腳本編程學習之路-函數


分享到:


相關文章: