zoukankan      html  css  js  c++  java
  • Shell编程之函数用法 (详解)

    大家好,今天给大家分享的是shell编程中的函数用法,当然这个函数和数学的函数是不一样的,那么在shell中的函数是什么样的,那么一起来看一下。

    1、首先在linux中它有一个命令是:alias 也就是别名的意思,那么这时候我们需要实际操作看看这个alias到底有什么用,如下:

    在以上图中我们使用了alias命令 后面跟着N=XXX 那么这个N呢就是一个别名,简单的说,当我们启动Nginx服务的时候我们会输入绝对路径,这时候我们可以设置一个别名,相当于N就等于xxx后面的那条路径,最后我们只输入N 那么就等于执行了启动命令。

    函数也有类似于别名的作用,简单的说,函数的作用就是将程序里面多次被调用的代码组合起来,称为函数体,并取一个名字称为(函数名),当我们需要用到这段代码的时候,我们就可以直接来调用函数名。

     

    2、Shell函数的语法

    在shell中 if语句有它的语法,for循环也有它的语法,那么shell中的函数,那肯定也有它的语法有以下三种:

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

    提示:在以上的函数语法中,前面的funcation 表示声明一个函数!!! 可以不写 return -n 是指退出函数

    例1:Shell函数实例如下

    function fj () {  
        echo "我是风姐!"  
    }  
      
    function zhangsan () {  
        echo "我是张三!"  
    }  
      
    fj  
    zhangsan 
    剖析:
    
    function fj () {             # 前面的function是声明一个函数 名字叫 fj () {
    echo "我是风姐!"          #下面呢 我们执行操作.echo 我是风姐
    }                                    #最后 我们以 } 为结束 
    
    function zhangsan () {    # 前面的function是声明一个函数 名字叫 zhangsan () {
    echo "我是张三!"    #下面呢 我们执行操作.echo 我是张三
    }                                        #最后 我们以 } 为结束 
    
    fj                   #调用fj 函数
    zhangsan      #调用zhangsan函数

    那么定义了两个函数,我们最终目的是要调用它所以 在函数的下面输入了fj 和 zhangsan 意思是说 我要调用这两个函数,那么这两个函数中有两个命令 输出一个张三和凤姐,所以在我们执行脚本的时候结果就会是如下:

     

    例2:分离函数体执行函数的脚本文件

    cat >>/etc/init.d/functions<< EOF  
    function zhangsan () {  
        echo "我就是张三"  
    }  
    EOF  

    以上代码什么意思:我们可以看到第一行是cat >> /etc/....这个路径 我们完全可以理解为,把下面的内容 导入到/etc/init.d/functions这个文件中; 那么这个文件是Linux系统内置的脚本函数库

     


    我们可以清楚的看到我们写的函数已经导入到了/etc/init.d/functions 这个文件中,那么接下来进行操作了 如下:

    #!/bin/bash  
    if [ -f /etc/init.d/functions ]  
      then  
        . /etc/init.d/functions  
    fi  
    zhangsan  

    解释:if 如果/etc/init.d/functions是一个普通文件,那么我们执行. /etc/init.d/functions 在这里这个"."是用来加载functions 中的命令或者变量参数等;最后因为我们在上面定义了zhangsan这个函数,那我们在最后一行可以调用这个zhangsan函数 输出如下:

     

    那么在这里我们来一个总结:

    当我们定义函数过多的情况下,我们可以把函数写在某一个文件中,当我们写脚本的时候需要用到这个函数中的某一个指令,那么我们就可以直接来调用文件中的函数名!

     

    例3:编写带参数的shell函数实例

    #!/bin/bash  
      
    function lisi () {  
            echo 我的名字叫: $1  
    }  
    lisi $1  

    在这里我们定义了一个名字叫做lisi的函数,这里需要注意的是echo那行,正常的输出是没有问题的,但是在后面加了一个特殊的位置变量。$1 最后在我们调用函数的时候 后面也加了特殊位置变量 $1 执行效果如下:

     

    3、利用Shell函数开发企业级URL检测脚本

    这是书上的一部分案例,但是我还会在这里通过我的想法来解释整个脚本中的全部过程!

    1)首先我们不用函数来写一个检测URL的脚本如下:

    #!/bin/bash  
    #no.1  
    if [ "$#" -ne 1 ]  
      then  
          echo "/root/sh/ $0" 请您输入一个网址  
          exit 1  
    fi  
    #no.2  
    wget --spider -q -o /dev/null --tries=1 -T 3 $1  
    if [ "$?" -eq 0 ]  
      then  
        echo "$1 检测是成功的!"  
      else  
        echo "$1 检测是失败的!"  
        exit 1  
    fi  

    剖析:

    #!/bin/bash  
    #no.1  
    if [ "$#" -ne 1 ]              #如果用户输入的传参参数不是1  
      then          # 那么    
          echo "/root/sh/ $0" 请您输入一个网址  #输出脚本路径和脚本名称 最后输出请您输入一个网址!  
          exit 1            #退出脚本  
    fi              #结束  
    #no.2  
    wget --spider -q -o /dev/null --tries=1 -T 3 $1 #如果用户输入传参数是对的,那么执行wget命令最后$1是用户输入的内容  
    if [ "$?" -eq 0 ]    #如果以上wget测试成功了!  
      then  #那么  
        echo "$1 检测是成功的!"  #输出用户输入网址并输出是成功的  
      else  #否则  
        echo "$1 检测是失败的!"  #输出用户输入网址并输出是失败的  
        exit 1      #退出脚本  
    fi    #fi结束  

    感觉不够养眼?没有关系,如下图

    以上此脚本中包含了特殊位置变量$#等等这些参数,大家看不懂的可以参考我之前的文章

    最后运行的结果如下:

    这不是重点,重点是我们使用shell函数来写整个过程,如下:

    function TS () {         
            echo "/root/sh/ $0" 请您输入一个网址  
            exit 1  
    }  
      
    function Check_url () {  
            wget --spider -q -o /dev/null --tries=1 -T 3 $1  
            if [ "$?" -eq 0 ]   
              then  
                echo "$1 检测成功!"  
              else  
                echo "$1 检测失败"  
                exit 1  
            fi        
    }  
      
    function JG () {  
            if [ "$#" -ne 1 ]  
              then  
                  TS  
            fi  
              Check_url $1  
    }  
    JG $*             

    剖析:

    function TS () {       #定义一个名字为TS的函数 (提示的意思)  
            echo "/root/sh/ $0" 请您输入一个网址 #执行的指令是 输出一个:请您输入一个网址  
            exit 1    #退出  
    }  
      
    function Check_url () {  #定义一个名字为Check_url的函数 (检测的意思)  
            wget --spider -q -o /dev/null --tries=1 -T 3 $1 #如果用户输入传参数是对的,那么执行wget命令最后$1是用户输  
    入的内容  
            if [ "$?" -eq 0 ] #如果以上wget去测试成功了!  
              then  #那么  
                echo "$1 检测成功!"  #输出用户输入网址并输出是成功的  
              else  #否则  
                echo "$1 检测失败"    # 输出用户输入网址并输出是失败的  
                exit 1  #退出  
            fi        
    }  
      
    function JG () {   #这是最后的函数JG(结果的意思)   
            if [ "$#" -ne 1 ]   ##如果用户输入的传参参数不是1  
              then      #那么  
                  TS         #注意了!!! 调用TS   
            fi            
              Check_url $1  #如果上面传参是1 那么就调用Check_url函数  
    }  
    JG $*  #这里的$*就是把命令行接收的所有参数作为函数传给函数内部  

    最后我们再次执行脚本

     

     

    最后为了能够让大家清晰的看到if语句的脚本和函数脚本的对比,一张图解释:

     

    4、案例二 实现菜单脚本,使用函数编写如下:

    function CDAN(){  
    cat << yankerp    
    +------------------------------------------------+  
    |                                                |  
    |        _o0o_          1. 安装Nginx             |  
    |        08880          2. 安装Apache            |  
    |       88"."88         3. 安装MySQL             |  
    |       (|-_-|)         4. 安装PHP               |  
    |        0=/0          5. 部署LNMP环境          |  
    |      __/   \__        6. 安装zabbix监控        |  
    |     ‘   ///‘       7. 退出此管理程序         |  
    |    / Linux一键       8. 关闭计算机            |  
    |  ||    Server   ||    ======================   |    
    |          ////         一键安装服务           |  
    |   |||  i i i    |||               by Yankerp   |  
    |   ___        ___      ======================   |  
    |___‘.  /--.-- .‘___                            |  
    +------------------------------------------------+  
    yankerp  
    }  
    CDAN  
      
    LOG_DIR=/usr/local/src  
    read -p "请您输入1-8任意数值:" NUM  
      
    if [ ${#NUM} -ne 1 ]  
      then  
            echo "请您输入1|2|3|4|5|6|7|8"  
            exit 1  
    fi  
      
    expr $NUM + 1 &>/dev/null  
    if [ "$?" -ne 0 ]  
       then  
            echo "请您输入数值!"  
            exit 1  
    fi  
      
    if [ "$NUM" -gt 8 ];then  
            echo "请您输入比8小的数值"  
            exit 1  
    elif [ "$NUM" -eq 0 ];then  
            echo "请您输入比0大的数值"  
            exit 1  
    fi  
    ######################  
    function Nginx_DIR() {  
            yum install -y gcc gcc-c++ pcre-devel zlib-devel openssl-devel &>/dev/null  
            if [ $? -eq 0 ]  
               then  
                    cd $LOG_DIR  && wget http://nginx.org/download/nginx-1.12.2.tar.gz &>/dev/null && useradd -M -s /sbin/nologin nginx &&   
            tar zxf nginx-1.12.2.tar.gz && cd nginx-1.12.2/ &&   
                    ./configure --prefix=/usr/local/nginx --with-http_dav_module --with-http_stub_status_module --with-http_addition_module --with-http_sub_module  --with-http_flv_module --with-http_mp4_module --with-pcre --with-http_ssl_module --with-http_gzip_static_module --user=nginx &>/dev/null && make &>/dev/null && make install &>/dev/null   
            fi  
      
            if [ -e /usr/local/nginx/sbin/nginx ];then  
                    ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/ && nginx && echo "Nginx安装并启动成功!!!"  
            fi  
    }  
      
    if [ $NUM -eq 1 ]  
      then  
         echo "开始安装Nginx请稍等..." && Nginx_DIR  
    fi  

    输出如下:

     

    以上脚本首先通过了if语句进行各种判断, 判断用户输入的参数等等;在后面使用了函数 来定义了安装Nginx的操作,最后我们调用了函数使整个函数运行了起来!!!

    呃,大家可以参考参考,若写的不好请谅解~ 我感觉对刚开始接触shell的人还是蛮有帮助的,只不过使用了多分支的if语句,感觉有点繁琐,接下来就会更新case语句了这样就可以解决多分支if语句很繁琐的问题!!!

  • 相关阅读:
    win7上装红米4手机驱动提示空间不足
    HBuilder中改造console.info
    Thinkphp 出现 “_CACHE_WRITE_ERROR” 错误的可能解决办法
    Linux上跑两个版本的php,5.4.45和5.3.24
    JavaScript中对日期格式化的新想法.
    怪不得知乎急着招前端开发.
    菜鸟利用python处理大文本数据的血泪路
    Python:数字
    Python:列表,元组
    Python:映像、集合
  • 原文地址:https://www.cnblogs.com/YankaiJY/p/8832436.html
Copyright © 2011-2022 走看看