shell編程之函數

函數:函數function是由若干條shell命令組成的語句塊,實現代碼 重用和模塊化編程
 
 
    1)函數的定義: 可在 命令行,腳本的一部分,只有函數的單獨文件 中定義
        兩部分組成:函數名和函數體;函數體可帶有返回狀態值 return #
         -語法一:
            function f_name {
            …函數體…
            }
 
         -語法二:
            f_name() {
            …函數體…
            }
 命令行下定義并調用函數

]#dir (){ ls;}
]#dir

 
    2)函數的調用: 函數只有被調用時才會執行
        給定函數名:
            無參數調用 f_name
            有參數調用 f_name arg1 arg2 …
  
        函數被調用時創建,返回時終止。
  
     命令行下: 定義函數后可直接調用  使用 #unset f_name 撤銷函數
 
     腳本中: 函數定義后才可使用,應將函數放在腳本開始部分
 
     函數文件: 將常用函數寫入函數文件,在命令行或腳本中加載該函數文件即可調用函數
        #set 查看所有已加載函數  #unset 刪除函數
 
      加載函數:
       source /path/to/filename
       . /path/to/filename
 
   加載函數文件

]#vi echo.sh
#!/bin/bash
#zjj
print_haha (){
 echo haha
 }
]#source echo.sh
]#print_haha
]#haha


    3)函數參數
        傳遞參數給函數:
        f_name arg1 arg2..
   
    函數體可使用$1,$2,…調用對應參數;$@,$*,$#等同樣可用

    注意 此處的的$1.$2與執行腳本時的參數不同,僅為調用函數時后面添加的參數


    4)函數變量
    注意 函數體中變量的操作會影響到整個腳本,
        可在函數中定義局部變量,只對函數體有效,使用local
        local var_name=value
  
    5)函數的遞歸
        函數直接或間接調用自身
        注意遞歸層數
  
 


===  函數練習:
 
 1.寫一個服務腳本/root/bin/testsrv.sh

#!/bin/bash
#zjj
testsrv() {

    bsname=`basename $0`
    local Srvpath=/var/lock/subsys/$bsname
    
    case $1 in
    start)        
        if [ -e $Srvpath ] ;then            
            echo +  $bsname is running        
        else            
            touch $Srvpath && echo ++ start successful          
        fi        
        ;;    
    stop)        
        if [ -e $Srvpath ] ;then            
            rm -f $Srvpath &&echo -- stop successful        
        else            
            echo -  $bsname is dead        
        fi        
        ;;    
    restart)        
        testsrv stop && testsrv start        
        ;;    
    status)        
        [ -e $Srvpath ] &&echo +  $bsname is running...  ||echo -  $bsname is stopped...        
        ;;    
    *)        
        testsrv status        
        ;;    
    esac
        
        }
testsrv $1



 2.編寫一個腳本/root/bin/copycmd.sh ,復制命令及其庫文件

#!/bin/bash
#zjj
copycmd() {

# create directiry if they does not exist
    local dpath='/testdir/sysroot'
    for dir in `echo $PATH|tr ':' ' '` "/lib" "/lib64" ;do
    [ -e ${dpath}${dir} ] &&continue ||mkdir -p ${dpath}${dir}
    done
    
while true ;do
    read -p "++enter a command or [quit]:" cmd
    [[ $cmd =~ quit ]] &&exit 23
    spath=`whereis -b $cmd 2>/dev/null|cut -d ' ' -f2`
    ! [ $? -eq 0 ] && echo invalid command &&continue
    cp -a $spath ${dpath}$spath &&echo copy  $spath ++succesful ||echo --error
    
    for so in `ldd $spath |sed -nr 's/.*> ([^[:space:]].*) \(.*/\1/p'`;do
        cp -n $so ${dpath}$so &&echo -e "copy  $so   \t++successful" ||echo --error
    done
done
}
copycmd

 
 
 3.寫一個函數實現兩個數字做為參數,返回最大值

#!/bin/bash
#zjj

max (){
[ $1 -gt $2 ]&&echo max:$1||echo max:$2
}
max $1 $2


 4.斐波那契數列

#!/bin/bash
#zjj

fibo() {
    if [ $1 -le 1 ];then
        echo $1    
    elif [ $1 -gt 1 ];then
        echo "$[$(fibo $[$1-1])+$(fibo $[$1-2])]"
    fi
}

if ! [ $1 -eq $1 ]&>/dev/null||[ $1 -lt 0 ]&>/dev/null||[ -z $1 ] ;then
    echo please enter a integer &&exit 23
else
    for((i=0;i<=$1;i++));do
        fibo $i
    done
fi

 
 
 5.漢諾塔解決

#!/bin/bash
#zjj

# move n-1 : A to B
# move n   : A to C
# move n-1 : B to C

hanoi() {
    if [ $1 -eq 1 ];then
        echo $2 to $4
    else
        hanoi $[$1-1] $2 $4 $3
        echo $2 to $4
        hanoi $[$1-1] $3 $2 $4
    fi
}
hanoi $1 A B C


原創文章,作者:Jasper,如若轉載,請注明出處:http://www.www58058.com/38405

(0)
JasperJasper
上一篇 2016-08-21
下一篇 2016-08-21

相關推薦

  • cat用法

    用法:cat [選項] [文件]… 將[文件]或標準輸入組合輸出到標準輸出。 -A, –show-all 等價于 -vET -b, –number-nonblank 對非空輸出行編號 -e 等價于 -vE -E, –show-ends 在每行結束處顯示 $ -n, –number 對輸出的所有行編號…

    2017-04-02
  • shell編程作業

    1、編寫腳本/root/bin/systeminfo.sh,顯示當前主機系統信息,包括主機名,IPv4地址,操作系統版本,內核版本,CPU型號,內存大小,硬盤大小。 [root@localhost sh.log]# cat systeminfo.sh  #!/bin/bash #author:DYW #顯示當前主機系統…

    Linux干貨 2016-08-15
  • LANMT架構搭建jspxcms

                    LANMT架構搭建jspxcms 前言 LANMT是什么? 實驗拓撲圖 實驗環境 實驗步驟 Tomcat配置 MySQL配置 jspxcms安裝 Apache Http…

    Linux干貨 2016-04-22
  • 周期性計劃任務Cron詳解

    概述 cron 是Linux 或者類 Unix 系統的作業調度程序。利用它,我們可以配置某些命令或者腳本,讓命令和腳本在某個設定的時間內周期性地運行。本文主要以描述了 CentOS 6的cron命令的詳細知識。 了解cron組件 cron程序由程序包cronie提供,我們可以通過rpm -qi cronie查看cronie的信息。 cron 的組件包括: 1…

    Linux干貨 2016-09-18
  • keepalived高可用雙主lvs-dr模型集群

    環境 centos6.8 在keepalived服務器上安裝keepalived RS服務器上安裝nginx ,安裝過程省略 為了便于實驗,四臺機器將關閉iptables和selinux 配置如下: K1: #修改keepalived配置文件 vim /etc/keepalived/keepalived.conf ! Configuration File f…

    2017-05-13
  • N25 The first week –Yorick

    1.計算機的組成及功能 ENIARC:馮諾依曼體系 1.1.運算器(所屬CPU)     進行計算 1.2.控制器(所屬CPU)     控制部件之間的協調,包括尋址操作     輔助性存儲(加速與提升CPU性能)     寄存器(鎖存數據)     緩存(緩…

    Linux干貨 2016-12-04
欧美性久久久久