1. 程式人生 > >《Shell 程式設計》07_函式

《Shell 程式設計》07_函式

《Shell 程式設計》07_函式

標籤(空格分隔): Shell


文章目錄

7.1 Shell 函式的概念與作用介紹

  • 簡單地說,函式的作用就是講程式裡多次被呼叫的相同程式碼組合起來(函式體),併為其取一個名字(即函式名),其他所有想重複呼叫這部分程式碼的地方都只需要呼叫這個名字就可以了。當需要修改這部分重複程式碼時,只需要改變函式體內的一份程式碼即可實現對所用呼叫的修改,也可以把函式獨立地寫到檔案裡,當需要呼叫函式時,再載入進來使用。

7.2 Shell 函式的語法

標準寫法:

function 函式名 () {
    指令...
    return n
}

簡化寫法 1:

function 函式名 {
    指令...
    return n
}

簡化寫法 2:

函式名 () {
    指令...
    return n
}

7.3 Shell 函式的執行

Shell 的函式分為最基本的函式和可以傳參的函式兩種,其執行方式分別如下:

1)執行不帶引數的函式時,直接輸入函式名即可(注意不帶小括號)。格式如下:

函式名
  • 執行函式的說明:
    • 執行 Shell 函式時,函式名前的 function 和函式後的小括號都不要帶。
    • 函式的定義必須在要執行的程式前面定義或載入。
    • Shell 執行系統中各種程式的執行順序為:系統別名 – 函式 – 系統命令 – 可執行檔案。
    • 函式執行時,會和呼叫它的指令碼共用變數,也可以為函式設定區域性變數及特殊位置引數。
    • 在 Shell 函式裡面,return 命令的功能與 exit 類似,return 的作用是退出函式,而 exit 是退出指令碼檔案。
    • return 語句會返回一個退出值(即返回值)

2)帶引數的函式執行方法,格式如下:

函式名 引數 1 引數 2
  • 函式後接引數的說明:
    • Shell 的位置引數($1、 2...
      2...、
      #、 *、 ? 及 [email protected])都可以作為函式的引數來使用。
    • 此時父指令碼的引數臨時地被函式引數所掩蓋或隱藏。
    • $0 比較特殊,它仍然是父指令碼的名稱。
    • 當函式執行完成時,原來的命令列指令碼的引數即可恢復。
    • 函式的引數變數是在函式體裡面定義的。

7.4 Shell 函式的基礎實踐

7.4.1 分離函式體和執行函式的指令碼檔案

  • 首先建立函式庫指令碼(預設不會執行函式)
  • 使用 cat 命令追加多行文字,以將函式程式碼追加到系統的函式檔案中,即 /etc/init.d/functions,命令如下:
cat >>/etc/init.d/functions<<- EOF

ylt(){
    echo "I am ylt."
}
EOF
[[email protected] ~]# tail -3 /etc/init.d/functions
ylt(){
    echo "I am ylt."
}
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1
ylt

帶引數的 Shell 函式

[[email protected] ~]# tail -3 /etc/init.d/functions
ylt(){
    echo "I am ylt. you are $1."
}
#!/bin/bash
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1
ylt yyy 

7.4.2 利用 Shell 函式開發 rsync 服務啟動指令碼

[[email protected] scripts]# cat rsync1.sh
#!/bin/bash
# checkconfig: 2345 20 80
. /etc/init.d/functions

function usage(){
        echo "usage:$0 {start|stop|restart}"
        exit 1
}

function start(){
        rsync --daemon
        sleep 1
        if [ `netstat -lntup|grep rsync|grep -v grep|wc -l` -ge 1 ]; then
                action "rsyncd is started." /bin/true
        else
                action "rsyncd is started." /bin/false
        fi
}

function stop(){
        killall rsync &>/dev/null
        sleep 2
        if [ `netstat -lntup|grep rsyncd|wc -l` -eq 0 ]; then
                action "rsyncd is stopped." /bin/true
        else
                action "rsyncd is stopped." /bin/false
        fi
}

function main(){
        if [ $# -ne 1 ]; then
                usage
        fi
        if [ "$1" = "start" ]; then
                start
        elif [ "$1" = "stop" ]; then
                stop
        elif [ "$1" = "restart" ]; then
                stop
                sleep 1
                start
        else usage
        fi
}

main $*
[[email protected] scripts]# sh rsync1.sh start
rsyncd is started.                                         [  OK  ]
[[email protected] scripts]# sh rsync1.sh stop
rsyncd is stopped.                                         [  OK  ]
[[email protected] scripts]# sh rsync1.sh restart
rsyncd is stopped.                                         [  OK  ]
rsyncd is started.                                         [  OK  ]
[[email protected] scripts]# sh rsync1.sh s
usage:rsync1.sh {start|stop|restart}