设为首页 收藏本站
查看: 1137|回复: 0

Shell笔记5——函数的知识与实践

[复制链接]

尚未签到

发表于 2018-8-21 06:35:57 | 显示全部楼层 |阅读模式
  本文主要讲解Shell脚本开发中函数的知识与实践
  基本大纲:
  1.Shell函数的概念与作用介绍
  2.Shell函数的语法大全
  3.Shell函数的执行
  4.Shell函数的基础实践
  5.Shell函数的企业级运用实践
  一:Shell函数的概念与作用介绍
  在讲解Shell函数之前,先回顾下Linux系统中别名的作用
  [root@aliyun ~]# alias ng='/etc/init.d/nginx'        #单引号是保证原样输出
  [root@aliyun ~]# ng restart        #执行ng就相当于执行/etc/init.d/nginx,最直接的好处就是简化了输入的,简单快捷
  nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
  nginx: configuration file /etc/nginx/nginx.conf test is successful
  Stopping nginx:                                            [  OK  ]
  Starting nginx:                                            [  OK  ]
  函数也有类似于别名的作用,例如可简化程序的代码量,让程序更易读、易改、易用
  简单的说,函数的作用就是将程序里多次被调用的相同代码组合起来(函数体),并为其取一个名字(即函数名),其他所有想重复调用这部分代码的地方都只需要调用这个名字就可以了。当需要修改这部分重复代码时,只需要改变函数体内的一份代码即可实现对所有调用的修改,也可以把函数独立地写到文件里,当需要调用函数时,再加载进来使用。
  使用Shell函数的优势如下:

  •   把相同的程序段定义成函数,可以减少整个程序的代码量,提升开发效率
  •   增加程序的可读性、易读性,提升管理效率
  •   可以实现程序功能模块化,使得程序具备通用性(可移植性)
  二:Shell函数的语法大全
  下面是Shell函数的常见语法格式。
  其标准写法为:
  function 函数名 (){
  指令...
  return n
  }
  简化写法1:
  function 函数名  {
  指令...
  return n
  }
  #在Shell函数的语法中,当有function时,函数名后面的小括号"()"部分可以省略不写。
  简化写法2:
  函数名 (){            #推荐使用这种写法来命名函数
  指令...
  return n
  }
  #在shell函数的语法中,function表示声明一个函数,这部分可以省略不写。
  三:Shell函数的执行
  Shell的函数分为最基本的函数和可以传参的函数两种,其执行方式分别说明如下。
  1)执行不带参数的函数时,直接输入函数名即可(注意不带小括号)。格式如下:
  函数名
  有关执行函数的重要说明:

  •   执行Shell函数时,函数名前的function和函数后的小括号都不要带
  •   函数的定义必须在要执行的程序前面定义和加载
  •   Shell执行系统中各种程序的执行顺序为:系统别名——函数——系统命令——可执行文件
  •   函数执行时,会和调用它的脚本共用变量,也可以为函数设定局部变量及特殊位置参数
  •   在Shell函数里面,return命令的功能与exit类似,return的作用是退出函数,而exit是退出脚本文件
  •   return语句会返回一个退出值(即返回值)给调用函数的当前程序,而exit会返回一个退出值(即返回值)给执行程序的当前Shell
  •   如果将函数存放在独立的文件中,被脚本加载使用时,需要使用source或"."来加载
  •   在函数内容一般使用local定义局部变量,这些变量离开函数后就会消失
  2)带参数的函数执行方法,格式如下:
  函数名    参数1    参数2
  函数后接参数的说明:

  •   Shell的位置参数($1、$2...$#、$*、$?及$@)都可以作为函数的参数来使用
  •   此时父脚本的参数临时的被函数参数所掩盖或隐藏
  •   $0比较特殊,它仍然是父脚本的名称
  •   当函数执行完成时,原来的命令行脚本的参数即可恢复
  •   函数的参数变量是在函数体里面定义的
  四:Shell函数的基础实践
  范例1:开发脚本建立两个简单函数并调用执行
[root@aliyun hs]# cat jdhs.sh  
ywxi( ){
  
    echo "I am ywxi."
  
}
  

  
ywxitest( ){
  
    echo "ywxi is test."
  
}
  
ywxi        #务必要先定义函数然后再执行函数,否则会报错
  
ywxitest
  
[root@aliyun hs]# sh jdhs.sh
  
I am ywxi.
  
ywxi is test.
  范例2:分离函数体和执行函数的脚本文件(更规范的方法)
  首先建立函数库脚本(默认不会执行函数)
  使用cat命令追加多行文本,以将函数代码追加到系统的函数文件中,即/etc/init.d/functions ,命令如下:
[root@aliyun hs]# cat >>/etc/init.d/functions     echo "I am ywxi."
  
> }
  
> EOF
  
[root@aliyun hs]# tail -3 /etc/init.d/functions
  
ywxi() {
  
    echo "I am ywxi."
  
}
  

  
[root@aliyun hs]# cat ceshi.sh
  
#提示:可以用source和.(点号)来加载脚本functions中的命令或变量参数等
  
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1
  
#调用函数
  
ywxi
  

  
[root@aliyun hs]# sh ceshi.sh
  
I am ywxi.
  范例3:带参数的Shell函数示例
[root@aliyun hs]# tail -3 /etc/init.d/functions  
ywxi() {
  
    echo "I am ywxi,you are $1"
  
}
  
[root@aliyun hs]# cat ceshi2.sh
  
#!/bin/bash
  
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1
  
ywxi xiaoming        #将xiaoming作为参数传给ywxi函数
  
[root@aliyun hs]# sh ceshi2.sh
  
I am ywxi,you are xiaoming        #由/etc/init.d/functions里的ywxi函数将xiaoming传给$1
  

  
[root@aliyun hs]# tail -3 /etc/init.d/functions
  
ywxi() {
  
    echo "I am ywxi,you are $1"
  
}
  
[root@aliyun hs]# cat ceshi3.sh
  
#!/bin/bash
  
[ -f /etc/init.d/functions ] && . /etc/init.d/functions || exit 1
  
ywxi $1        #这个$1本身是脚本的位置参数,但是$1占据的位置为函数的参数位置,现在他们重合了
  
[root@aliyun hs]# sh ceshi3.sh xiaoming    #传入xiaoming
  
I am ywxi,you are xiaoming
  五:Shell函数的企业级运用实践
  利用Shell函数开发企业级URL检测脚本
  脚本示例如下:
[root@aliyun hs]# cat url.sh  
#!/bin/bash
  
. /etc/init.d/functions         #引入系统函数库
  
function usage( ) {
  
    echo $"usage:$0 URL"
  
    exit 1
  
}
  
function check_url( ) {
  
    wget --spider -q -o /dev/null --tries=1 -T 5 $1
  
    if [ $? -eq 0 ]
  
    then
  
        action "$1 is success." /bin/true    #这里的action就是在脚本开头引入系统函数库后调用的
  
    else
  
        action "$1 is fail." /bin/false
  
    fi
  
}
  
function main( ) {
  
    if [ $# -ne 1 ]
  
    then
  
        usage
  
    fi
  
    check_url $1
  
}
  
main $*
  

  
#脚本测试
  
[root@aliyun hs]# sh url.sh www.baidu.com
  
www.baidu.com is success.                                  [  OK  ]
  
[root@aliyun hs]# sh url.sh www.baisdu.com
  
www.baisdu.com is success.                                 [  OK  ]
  
[root@aliyun hs]# sh url.sh www.baiasdsdasdu.com
  
www.baiasdsdasdu.com is fail.                              [FAILED]



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-554402-1-1.html 上篇帖子: shell脚本从入门到复杂 其七(循环) 下篇帖子: shell 编程进阶与自动化脚本expect的运用
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表