zoukankan      html  css  js  c++  java
  • shell 函数用法

      近期在学习shell编程方面的知识,写的不怎么好,请大家多多指点,下面给大家分享一下shell函数的用法。

    我们为什么要用shell函数?

      简单的说,函数的作用就是把程序多次调用相同的代码部分定义成一份,然后为这一份代码定义一个名字,其它所有重复调用这部分代码就都只调用定义的这个名字就OK了,当需要修改这部分重复代码时,只需要修改函数体内的一部分代码即可实现所有调用修改。

    使用函数的优势:

    ①把相同的程序定义成函数,可以减少整个程序的代码量

    ②增加程序的可读性、异读性,以及可管理性。

    ③可以实现程序功能模块化,不同的程序使用函数模块化。

    shell函数的语法:

     1 shell函数语法
     2 函数名()
     3 {
     4     指令...
     5     return n
     6 }
     7  8 function 函数名()    #funcation 表示定义一个函数
     9 {
    10     指令...
    11     return n       #输出返回值
    12 }

    说明:shell的返回值是用exit输出返回值,而函数里用return输出返回值。

    【函数带参数的说明】

    1:函数体中位置参数($0$1、$2、$#、$*、$?、$$以及$@)都可以是函数的参数
    2:父脚本的参数则临时地被函数参数所掩盖或隐藏
    3:$0比较特殊,它仍然是父脚本的名称
    4:当函数完成时,原来的命令行参数会恢复
    5:在shell函数里面,return命令的功能的工作方式与exit相同,用于跳出函数
    6:在shell函数体里使用exit会终止整个shell脚本
    7:return语句会返回一个退出值给调用的程序
    --------------------------------------------------------------------------------------------------
    附:1 shell的特殊位置变量解释:

    $0 取脚本的文件名及路径
    $1,$2 给脚本传参数
    $* 把一堆参数集合成一个参数,传给脚本
    $# 一共传了多少个参数
    $$ 脚本的pid
    $? 上一个脚本执行的返回值
    $@ 与$*类似,区别是每个参数是分开的

    测试:函数调用

     1 [root@bqh-117 scripts]# vim hsdy.sh
     2 #!/bin/sh
     3 bqh() {
     4    echo "I am bqh linux."
     5 }
     6 
     7 function jyw() {
     8   echo "I am jyw linux."
     9 }
    10 bqh
    11 jyw

    解释:我们定义了两个函数,一个bqh,一个jyw,这两个函数里的命令分别为输入"I am bqh linux."和"I am jyw linux.",函数下面最终是调用他们,所有我们执行脚本结果如下:

    测试:if传参数用法

     1 [root@bqh-117 scripts]# vim hscc.sh
     2 #!/bin/sh
     3 #no.1
     4 [ "$#" -ne 1  ]&&{              #判断用户是否输入了一个网址
     5  echo "$0 请输入一个网址!"       #取脚本的文件名及路径及请输入一个网址!
     6  exit 1
     7 }
     8 #no.2
     9 wget --spider --timeout=8 --tries=2 $1 &>/dev/null #若用户输入传参数是正确的,就执行wget命令
    10 if [ "$?" -eq 0 ];then             #判断以上命令执行是否有误
    11    echo  "$1 Httpd is Running... "    #若判断以上命令无误,输入用户传参数及检测结果
    12 else
    13    echo "$1 Httpd is Stoped..."       #若判断以上命令有误,输出用户传参数及检测结果
    14    exit 2
    15 fi

    运行脚本效果如下:

    接下来我们使用shell函数来实现,如下:

     1 [root@bqh-117 scripts]# vim hscc.sh 
     2 #!/bin/sh
     3 #no.1
     4 [ "$#" -ne 1  ]&&{              #判断用户是否输入了一个网址
     5  echo "$0 请输入一个网址!"       #取脚本的文件名及路径及请输入一个网址!
     6  exit 1
     7 }
     8 #no.2
     9 wget --spider --timeout=8 --tries=2 $1 &>/dev/null #若用户输入传参数是正确的,就执行wget命令
    10 if [ "$?" -eq 0 ];then             #判断以上命令执行是否有误
    11   echo  "$1 Httpd is Running... "    #若判断以上命令无误,输入用户传参数及检测结果
    12 else
    13   echo "$1 Httpd is Stoped..."       #若判断以上命令有误,输出用户传参数及检测结果
    14     exit 2
    15 fi
    16 #============================================================================================
    17 function chuancan() {           #定义一个chuancan函数提醒用户输入一个网址
    18   echo "$0 请输入一个网址"     #取脚本的文件名及路径及请输入一个网址!
    19   exit 1
    20 }
    21 
    22 function jc_url() {   #定义一个jc_url的函数检测用户输入参数是否正确及检测结果
    23  wget --spider --timeout=8 --tries=2 $1 &>/dev/null #若用户输入传参数是正确的,就执行wget命令
    24 if [ "$?" -eq 0 ]     #判断以上命令执行是否有误
    25  then
    26      echo "$1 Httpd is Running... " #若判断以上命令无误,输入用户传参数及检测结果
    27  else
    28      echo "$1 Httpd is Stoped..."  #若判断以上命令有误,输出用户传参数及检测结果
    29      exit 1
    30 fi
    31 }
    32 
    33 function panduan() {  #定义最后结果的函数
    34 if [ "$#" -ne 1 ]    #如果用户输入的传参数不是1
    35  then               #那么
    36       chuancan     #调用chuancan函数
    37 fi
    38       jc_url $1    #如果用户输入的传参数是1,那么久调用jc_url 函数
    39 }
    40 
    41 panduan $* #把命令行接收的所有参数传给函数内部

    我们换一种效果加以对比if脚本和函数脚本:

    运行脚本效果如下:

    案例实战:利用菜单选项脚本,实现shell函数调用(以安装nginx服务为例)

     1 [root@bqh-117 scripts]# vim yjaz.sh 
     2 #!/bin/sh
     3 function  menu() {        #定义一个菜单函数
     4  cat << bqh
     5 ++++++++++++++++++++++++++++++++++++++++++++++++++
     6 |                                                |
     7 |                          一键安装服务指南:       |
     8 |                        ======================  |
     9 |                          1、 安装Nginx          |
    10 |          _o0o_           2、 安装Apache         |
    11 |        088"."880         3、 安装MySQL          |
    12 |         (|-_-|)          4、 安装PHP            |
    13 |         _.=/._          5、部署LNMP环境         |
    14 |       __/-   -\__        6、安装zabbix监控       |
    15 |      ‘    *    /‘       7、退出此服务程序        |
    16 |     /      *            8、关闭计算机           |
    17 |    ||      *      ||   ======================  |    
    18 |     \     *     //                            |
    19 |     |||  b q h  |||                            |
    20 |     ___        ___             name: aゞ锦衣卫  |  
    21 |  ___‘.  /--.-- .‘___          date:2019-04-11 |
    22 --------------------------------------------------
    23 bqh 24 } 25 menu 26 27 if [ ! -d /home/bqh/tools ] #判断是否有/home/bqh/tools目录,没有的话就创建一个 28 then 29 mkdir -p /home/bqh/tools 30 fi 31 azlj_dir=/home/bqh/tools 32 33 read -p "请输入1-8任意数:" num #利用read读取外界传递的参数 34 if [ ${#num} -ne 1 ] #判断读取的参数是否是一个,如果不是给出提示并退出 35 then 36 echo "请输入1|2|3|4|5|6|7|8 任意数" 37 exit 1 38 fi 39 40 expr $num + 1 &>/dev/null #利用expr 检查传递过来的参数是否为整数,并将结果定向空 41 42 if [ "$?" -ne 0 ] #判断上面检查结果是否为0,若不为0给出提示并退出。 43 then 44 echo "请输入数字" 45 exit 1 46 fi 47 48 if [ "$num" -eq 0 ] #判断输入的值是否等于0,若等于给出提示并退出。 49 then 50 echo "请输入比0大的整数" 51 exit 1 52 54 elif [ "$num" -gt 8 ] #判断输入的值是否大于8,若大于给出提示并退出。 55 then 56 echo "请输入比9小的整数" 57 exit 1 58 fi 59 #======================================= 60 function nginx_az () { #定义nginx安装函数。 61 yum install -y zlib zlib-devel gcc-c++ libtool openssl openssl-devel pcre pcre-devel &>/dev/null 62 if [ $? -eq 0 ] 63 then 64 cd $azlj_dir && wget -q http://nginx.org/download/nginx-1.6.3.tar.gz &>/dev/null && 65 groupadd -r nginx && 66 useradd -s /sbin/nologin -g nginx -M nginx && 67 tar zxf nginx-1.6.3.tar.gz && 68 ./configure --prefix=/application/nginx-1.6.3 --user=nginx --group=nginx --with-http_ssl_module - 69 -with-http_stub_status_module &>/dev/null && make && make install &>/dev/null 70 fi 71 if [ -e /application/nginx/sbin/nginx ] 72 then 73 ln -s /application/nginx-1.6.3/ /application/nginx && /application/nginx/sbin/nginx && 74 echo "nginx 安装成功并启动!" 75 fi 76 } 77 78 if [ $num -eq 1 ] #如果输入1值时,给出相应提示并调用nginx_az函数。 79 then 80 echo "开始安装nginx请稍等..." && nginx_az 81 fi

    执行脚本效果如下:

    以上脚本首先是通过if判断用户输入的值是否符合条件,后面函数定义安装nginx,最后调用函数一键安装。

  • 相关阅读:
    Java 工程转 C#
    初涉Linux ----------> 打造自己的 Vim IDE
    初涉Linux ----------> Ubuntu15.04的安装与美化
    没学过CSS等前端的我,也想美化一下自己的博客
    作为程序员之 Vim(一)
    win7升win10,初体验
    作为程序员之正则表达式
    数据库系统原理
    Mysql数据库笔记
    我的个人常用快捷键
  • 原文地址:https://www.cnblogs.com/su-root/p/10633968.html
Copyright © 2011-2022 走看看