shell指令碼編程之函數

來源:互聯網
上載者:User

標籤:shell 函數

函數:function 

  過程式編程:代碼重用

    模組化編程

    結構化編程 

把一段獨立功能的代碼當作一個整體,並為之一個名字;命名的程式碼片段,此即為函數;

注意:定義函數的程式碼片段不會自動執行,在調用時執行;所謂調用函數,在代碼中給定函數名即可;

函數名出現的任何位置,在代碼執行時,都會被自動替換為函數代碼;

    文法一:

function  f_name  {

...函數體...

}

    文法二:

f_name()  {

...函數體...

}

函數的生命週期:每次被調用時建立,返回時終止;

其狀態返回結果為函數體中啟動並執行最後一條命令的狀態結果;

自訂狀態傳回值,需要使用:return

return [0-255]

0: 成功

-255: 失敗

樣本:給定一個使用者名稱,取得使用者的id號和預設shell;

#!/bin/bash#userinfo() {    if id "$username" &> /dev/null; then    grep "^$username\>" /etc/passwd | cut -d: -f3,7    else    echo "No such user."    fi}username=$1userinfousername=$2userinfo


樣本2:服務指令碼架構

#!/bin/bash## chkconfig: - 50 50# description: test service script#prog=$(basename $0)lockfile=/var/lock/subsys/$progstart() {    if [ -f $lockfile ]; then        echo "$prog is running yet."    else        touch $lockfile        [ $? -eq 0 ] && echo "start $prog finshed."    fi}stop() {    if [ -f $lockfile ]; then        rm -f $lockfile        [ $? -eq 0 ] && echo "stop $prog finished."    else        echo "$prog is not running."    fi}status() {    if [ -f $lockfile ]; then        echo "$prog is running"    else        echo "$prog is stopped."    fi}usage() {    echo "Usage: $prog {start|stop|restart|status}"}case $1 in    start)        start ;;    stop)        stop ;;    restart)        stop        start ;;    status)        status ;;    *)        usage        exit 1 ;;esac

函數傳回值:

函數的執行結果傳回值:

    (1) 使用echo或printf命令進行輸出;

    (2) 函數體中調用的命令的執行結果;

函數的退出狀態代碼:

    (1) 預設取決於函數體中執行的最後一條命令的退出狀態代碼;

    (2) 自訂:return

函數可以接受參數:

    傳遞參數給函數:

    在函數體中當中,可以使用$1,$2, ...引用傳遞給函數的參數;還可以函數中使用$*或[email protected]引用所有參數,$#引用傳遞的參數的個數;

    在調用函數時,在函數名後面以空白符分隔給定參數列表即可,例如,testfunc  arg1 arg2 arg3 ...

樣本:添加10個使用者,

添加使用者的功能使用函數實現,使用者名稱做為參數傳遞給函數;

#!/bin/bash## 5: user existsaddusers() {    if id $1 &> /dev/null; then        return 5    else        useradd $1        retval=$?        return $retval    fi}for i in {1..10}; do    addusers ${1}${i}    retval=$?    if [ $retval -eq 0 ]; then        echo "Add user ${1}${i} finished."    elif [ $retval -eq 5 ]; then        echo "user ${1}${i} exists."    else        echo "Unkown Error."    fidone


變數範圍:

局部變數:範圍是函數的生命週期;在函數結束時被自動銷毀;

定義局部變數的方法:local VARIABLE=VALUE

本地變數:範圍是運行指令碼的shell進程的生命週期;因此,其作用範圍為當前shell指令碼程式檔案;

樣本程式:

#!/bin/bash#name=tomsetname() {    local name=jerry    echo "Function: $name"}setnameecho "Shell: $name"

函數遞迴:

函數直接或間接調用自身;

案例:實現如下功能

10!=10*9!=10*9*8!=10*9*8*7!=...

n

n*(n-1)!=n*(n-1)*(n-2)!=

#!/bin/bash#fact() {    if [ $1 -eq 0 -o $1 -eq 1 ]; then        echo 1        else        echo $[$1*$(fact $[$1-1])]    fi}fact $1


實現如下數列:

1,1,2,3,5,8,13,21,...

#!/bin/bash#fab() {if [ $1 -eq 1 ]; then        echo -n "1 "    elif [ $1 -eq 2 ]; then        echo -n "1 "    else        echo -n "$[$(fab $[$1-1])+$(fab $[$1-2])] "fi}for i in $(seq 1 $1); do    fab $idoneecho


本文出自 “汪立明” 部落格,請務必保留此出處http://afterdawn.blog.51cto.com/7503144/1916045

shell指令碼編程之函數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.