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.178linux.com/38405

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

相关推荐

  • shell脚本编程初步

    shell脚本编程初步    随着课程学习的深入,我们已经学习了一些常用的命令,会去解决了一部分简单的问题,但是这不能满足复杂的工作,它可以帮助我执行自动化的常用命令、执行系统管理和故障排除、创建简单的应用程序、处理文本或文件。所以我们开始了shell脚本的编程,帮助我们更好的去完成工作。简单地说,shell编程相当于帮我们之前…

    Linux干货 2016-08-15
  • 马哥教育网络班22期第二周课程练习1-未闻花名

    1、Linux管理文件和目录的命令 命令 功能 命令 功能 pwd 显示当前目录 ls 查看目录下的内容 cd 改变所在目录 cat 显示文件的内容 grep 在文件中查找某字符 cp 复制文件 touch 创建文件 mv 移动文件 rm 删除文件 rmdir 删除目录 1.1 pwd命令 该命令的英文解释为print working directory(打…

    Linux干货 2016-08-29
  • rsync+inotify实现实时同步案例

    随着应用系统规模的不断扩大,对数据的安全性和可靠性也提出的更好的要求,rsync在高端业务系统中也逐渐暴露出了很多不足,首先,rsync同步数据时,需要扫描所有文件后进行比对,进行差量传输。如果文件数量达到了百万甚至千万量级,扫描所有文件将是非常耗时的。而且正在发生变化的往往是其中很少的一部分,这是非常低效的方式。其次,rsync不能实时的去监测、同步数据,…

    Linux干货 2016-10-30
  • ArchLinux折腾记

    刚接触linux的时候, 听到前辈说到这样一个系统,  说是linux 技能纯熟才能驾驭的了ArchLinux , 最近正好有个半天闲, 于是抽空,  佐以官方文档,  来认认真真的折腾一下ArchLinux Contents ArchLinux简介  准备工作  分区设置  基本功能安装 &nbs…

    Linux干货 2016-09-29
  • 9.脚本练习

    1、写一个脚本,判断当前系统上所有用户的shell是否为可登录shell(即用户的shell不是/sbin/nologin);分别这两类用户的个数;通过字符串比较来实现;  declare -a shell     declare sum_login=0     declare sum_nologin=0     shell=($(cat /etc/pass…

    2017-09-20
  • 第二周作业

    1. Linux上文件管理类命令总结及示例 文件管理命令主要由查看类命令和管理类命令组成 查看类命令 cat:显示文本 cat [OPTION]… [FILE].. tac:倒序查看文件内容 tac [OPTION]… [FILE].. head:显示文件前几行内容 head [OPTION]… [FILE].. -n#:指定获取前#行,也可直接使用-# -…

    Linux干货 2016-12-10