Shell筆記5——函數的知識與實踐

本文主要講解Shell腳本開發中函數的知識與實踐nginx

基本大綱:shell

  1.Shell函數的概念與做用介紹bash

  2.Shell函數的語法大全ide

  3.Shell函數的執行模塊化

  4.Shell函數的基礎實踐函數

  5.Shell函數的企業級運用實踐測試




一:Shell函數的概念與做用介紹url

  在講解Shell函數以前,先回顧下Linux系統中別名的做用
spa

[root@aliyun ~]# alias ng='/etc/init.d/nginx'        #單引號是保證原樣輸出命令行

[root@aliyun ~]# ng restart        #執行ng就至關於執行/etc/init.d/nginx,最直接的好處就是簡化了輸入的,簡單快捷

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok

nginx: configuration file /etc/nginx/nginx.conf test is successful

Stopping nginx:                                            [  OK  ]

Starting nginx:                                            [  OK  ]

  函數也有相似於別名的做用,例如可簡化程序的代碼量,讓程序更易讀、易改、易用

  簡單的說,函數的做用就是將程序裏屢次被調用的相同代碼組合起來(函數體),併爲其取一個名字(即函數名),其餘全部想重複調用這部分代碼的地方都只須要調用這個名字就能夠了。當須要修改這部分重複代碼時,只須要改變函數體內的一份代碼便可實現對全部調用的修改,也能夠把函數獨立地寫到文件裏,當須要調用函數時,再加載進來使用。

  使用Shell函數的優點以下:

  • 把相同的程序段定義成函數,能夠減小整個程序的代碼量,提高開發效率

  • 增長程序的可讀性、易讀性,提高管理效率

  • 能夠實現程序功能模塊化,使得程序具有通用性(可移植性)




二:Shell函數的語法大全

下面是Shell函數的常見語法格式。

其標準寫法爲:

function 函數名 (){

    指令...

    return n

}


簡化寫法1:

function 函數名  {

    指令...

    return n

}

#在Shell函數的語法中,當有function時,函數名後面的小括號"()"部分能夠省略不寫。


簡化寫法2:

函數名 (){            #推薦使用這種寫法來命名函數

    指令...

    return n

}

#在shell函數的語法中,function表示聲明一個函數,這部分能夠省略不寫。




三:Shell函數的執行

Shell的函數分爲最基本的函數和能夠傳參的函數兩種,其執行方式分別說明以下。

1)執行不帶參數的函數時,直接輸入函數名便可(注意不帶小括號)。格式以下

函數名

有關執行函數的重要說明:

  • 執行Shell函數時,函數名前的function和函數後的小括號都不要帶

  • 函數的定義必須在要執行的程序前面定義和加載

  • Shell執行系統中各類程序的執行順序爲:系統別名——函數——系統命令——可執行文件

  • 函數執行時,會和調用它的腳本共用變量,也能夠爲函數設定局部變量及特殊位置參數

  • 在Shell函數裏面,return命令的功能與exit相似,return的做用是退出函數,而exit是退出腳本文件

  • return語句會返回一個退出值(即返回值)給調用函數的當前程序,而exit會返回一個退出值(即返回值)給執行程序的當前Shell

  • 若是將函數存放在獨立的文件中,被腳本加載使用時,須要使用source或"."來加載

  • 在函數內容通常使用local定義局部變量,這些變量離開函數後就會消失


2)帶參數的函數執行方法,格式以下:

函數名    參數1    參數2

函數後接參數的說明:

  • Shell的位置參數($一、$2...$#、$*、$?及$@)均可以做爲函數的參數來使用

  • 此時父腳本的參數臨時的被函數參數所掩蓋或隱藏

  • $0比較特殊,它仍然是父腳本的名稱

  • 當函數執行完成時,原來的命令行腳本的參數便可恢復

  • 函數的參數變量是在函數體裏面定義的




四:Shell函數的基礎實踐

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

[root@aliyun hs]# cat jdhs.sh
ywxi( ){
    echo "I am ywxi."
}

ywxitest( ){
    echo "ywxi is test."
}
ywxi        #務必要先定義函數而後再執行函數,不然會報錯
ywxitest
[root@aliyun hs]# sh jdhs.sh 
I am ywxi.
ywxi is test.


範例2:分離函數體和執行函數的腳本文件(更規範的方法)

首先創建函數庫腳本(默認不會執行函數)

使用cat命令追加多行文本,以將函數代碼追加到系統的函數文件中,即/etc/init.d/functions ,命令以下:

[root@aliyun hs]# cat >>/etc/init.d/functions<<- EOF
> ywxi() {
>     echo "I am ywxi."
> }
> EOF
[root@aliyun hs]# tail -3 /etc/init.d/functions 
ywxi() {
    echo "I am ywxi."
}

[root@aliyun hs]# cat ceshi.sh
#提示:能夠用source和.(點號)來加載腳本functions中的命令或變量參數等
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1
#調用函數
ywxi

[root@aliyun hs]# sh ceshi.sh 
I am ywxi.


範例3:帶參數的Shell函數示例

[root@aliyun hs]# tail -3 /etc/init.d/functions 
ywxi() {
    echo "I am ywxi,you are $1"
}
[root@aliyun hs]# cat ceshi2.sh 
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1
ywxi xiaoming        #將xiaoming做爲參數傳給ywxi函數
[root@aliyun hs]# sh ceshi2.sh 
I am ywxi,you are xiaoming        #由/etc/init.d/functions裏的ywxi函數將xiaoming傳給$1

[root@aliyun hs]# tail -3 /etc/init.d/functions 
ywxi() {
    echo "I am ywxi,you are $1"
}
[root@aliyun hs]# cat ceshi3.sh 
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1
ywxi $1        #這個$1自己是腳本的位置參數,可是$1佔據的位置爲函數的參數位置,如今他們重合了
[root@aliyun hs]# sh ceshi3.sh xiaoming    #傳入xiaoming
I am ywxi,you are xiaoming




五:Shell函數的企業級運用實踐

利用Shell函數開發企業級URL檢測腳本

腳本示例以下:

[root@aliyun hs]# cat url.sh 
#!/bin/bash
. /etc/init.d/functions         #引入系統函數庫
function usage( ) {
    echo $"usage:$0 URL"
    exit 1
}
function check_url( ) {
    wget --spider -q -o /dev/null --tries=1 -T 5 $1
    if [ $? -eq 0 ]
    then
        action "$1 is success." /bin/true    #這裏的action就是在腳本開頭引入系統函數庫後調用的
    else
        action "$1 is fail." /bin/false
    fi
}
function main( ) {
    if [ $# -ne 1 ]
    then
        usage
    fi
    check_url $1
}
main $*

#腳本測試
[root@aliyun hs]# sh url.sh www.baidu.com
www.baidu.com is success.                                  [  OK  ]
[root@aliyun hs]# sh url.sh www.baisdu.com
www.baisdu.com is success.                                 [  OK  ]
[root@aliyun hs]# sh url.sh www.baiasdsdasdu.com
www.baiasdsdasdu.com is fail.                              [FAILED]
相關文章
相關標籤/搜索