Shell编程——函数

Shell编程——函数 函数1、Shell函数的概念与作用介绍2、Shell函数的语法3、Shell函数的执行4、Shell函数的基础实践5、利用Shell函数开发企业级URL检测脚本1、Shell函数的概念与作用介绍在讲解Shell函数之前先来回顾Linux系统中别名的作用。[rootoldboy ]# alias ssh/etc/init.d/sshd[rootoldboy ]# ssh restart #执行ssh就相当于执行了/etc/init.d/sshd最直接的好处就是简化了输入。 停止 sshd:[确定]正在启动 sshd:[确定]函数也有类似于别名的作用例如可简化程序的代码量让程序更易读、易改、易用。简单地说函数的作用就是将程序里多次被调用的相同代码组合起来函数体​并为其取一个名字即函数名​其他所有想重复调用这部分代码的地方都只需要调用这个名字就可以了。当需要修改这部分重复代码时只需要改变函数体内的一份代码即可实现对所有调用的修改也可以把函数独立地写到文件里当需要调用函数时再加载进来使用。使用Shell函数的优势整理如下把相同的程序段定义成函数可以减少整个程序的代码量提升开发效率。增加程序的可读性、易读性提升管理效率。可以实现程序功能模块化使得程序具备通用性可移植性​。对于Shell来说Linux系统里的近2000个命令可以说都是Shell的函数所以 Shell的函数也是很多的这一点需要读者注意。2、Shell函数的语法下面是Shell函数的常见语法格式。其标准写法为function函数名(){#作者推荐的书写函数的方法带括号指令...returnn}简化写法1function函数名{#不推荐读者使用此方法无括号指令...returnn}在Shell函数的语法中当有function时函数名后面的小括号“​​​”部分可以省略不写。简化写法2函数名(){#不用function的方法指令...returnn}在Shell函数的语法中function表示声明一个函数这部分可以省略不写。3、Shell函数的执行Shell的函数分为最基本的函数和可以传参的函数两种其执行方式分别说明如下。1执行不带参数的函数时直接输入函数名即可注意不带小括号​。格式如下函数名有关执行函数的重要说明执行Shell函数时函数名前的function和函数后的小括号都不要带。函数的定义必须在要执行的程序前面定义或加载。Shell执行系统中各种程序的执行顺序为系统别名→函数→系统命令→可执行文件。函数执行时会和调用它的脚本共用变量也可以为函数设定局部变量及特殊位置参数。在Shell函数里面return命令的功能与exit类似return的作用是退出函数而exit是退出脚本文件。return语句会返回一个退出值即返回值给调用函数的当前程序而exit会返回一个退出值即返回值给执行程序的当前Shell。如果将函数存放在独立的文件中被脚本加载使用时需要使用source或“. ”来加载。在函数内一般使用local定义局部变量这些变量离开函数后就会消失。2带参数的函数执行方法格式如下函数名 参数1 参数2函数后接参数的说明Shell的位置参数$1、2 … 、 2…、2…、#、∗ 、 *、∗、及$都可以作为函数的参数来使用。此时父脚本的参数临时地被函数参数所掩盖或隐藏。当函数执行完成时原来的命令行脚本的参数即可恢复。函数的参数变量是在函数体里面定义的。4、Shell函数的基础实践范例开发脚本建立两个简单函数并调用执行。[rootoldboy scripts]# cat 8_1.sh#! /bin/bash#定义两个函数名字为oldboy和oldgirl。oldboy(){echoI am oldboy.}functionoldgirl(){echoI am oldgirl.}oldboy#在一个脚本里执行函数名调用函数。oldgirl#在一个脚本里执行函数名调用函数。务必要先定义函数然后再执行函数否则会报错示例如下[rootoldboy scripts]# cat 8_2.sh#! /bin/basholdgirlfunctionoldgirl(){echoI am oldgirl.}oldgirl[rootoldboy scripts]# sh 8_2.sh8_2.sh: line2: oldgirl:commandnot found#提示第二行因为oldgirl函数不存在所以就把oldgirl当作命令了但是系统又没有oldgirl命令。I am oldgirl.范例分离函数体和执行函数的脚本文件更规范的方法​。首先建立函数库脚本默认不会执行函数​。使用cat命令追加多行文本以将函数代码追加到系统的函数文件中即/etc/init.d/functions命令如下cat/etc/init.d/functions- EOF#here文档的另一种写法此写法允许后面的EOF可以使用Tab键而不顶格。oldboy(){echoI am oldboy.}EOF#就是这里的EOF可以使用Tab键而不顶格但不能使用空格。追加的函数代码如下[rootoldboy scripts]# tail -3 /etc/init.d/functionsoldboy(){echoI am oldboy.}然后开发执行脚本以调用上述函数。[rootoldboy scripts]# cat 8_3.sh#! /bin/bash#加载函数所在的文件functions是Linux系统内置的脚本函数库[-f/etc/init.d/functions]./etc/init.d/functions||exit1#提示可以用source 或“.”点号来加载脚本functions中的命令或变量参数等。#调用函数oldboy执行结果如下[rootoldboy scripts]# sh 8_3.shI am oldboy.范例写出带参数的Shell函数示例。这里通过建立函数oldgirl来做示例讲解代码截图如图所示。范例将函数的传参转换成脚本文件命令行传参。参考答案见图。5、利用Shell函数开发企业级URL检测脚本范例将函数的传参转换成脚本文件命令行传参判断任意指定的URL是否存在异常。程序设计思路及实现1实现脚本传参检查Web URL是否正常。[rootoldboy scripts]# cat 8_5.sh#! /bin/sh#判断传参个数是否为1个。if[$#-ne1]thenecho$usage:$0urlexit1fi#利用wget进行访问测试wget的相关参数在前面章节已经讲解过了。wget--spider-q-o/dev/null--tries1-T5$1#-T指定超时时间这里的$1为脚本的参数。if[$?-eq0]thenecho$1is yes.elseecho$1is no.fi2将上述检测的功能写成函数并将函数传参转换成脚本命令行传参判断任意指定的URL是否存在异常。[rootoldboy scripts]# cat 8_5_1.sh#! /bin/shfunctionusage(){#帮助函数。echo$usage:$0urlexit1}functioncheck_url(){#检测URL函数。wget--spider-q-o/dev/null--tries1-T5$1#这里的$1就是函数传参。if[$?-eq0]thenecho$1is yes.elseecho$1is no.fi}functionmain(){#主函数。if[$#-ne1]#如果传入的是多个参数则打印帮助函数提示用户。thenusageficheck_url$1#接收函数的传参即把下文main结尾的$传到这里。}main $#这里的$就是把命令行接收的所有参数作为函数参数传给函数内部是一种常用手法。执行结果如下[rootoldboy scripts]# sh 8_5_1.shusage:8_5_1.sh url[rootoldboy scripts]# sh 8_5_1.sh www.oldboyedu.comwww.oldboyedu.com is yes.[rootoldboy scripts]# sh 8_5_1.sh www.oldgirl123.comwww.oldgirl123.com is no.范例将函数的传参转换成脚本文件命令行传参判断任意指定的URL是否存在异常并以更专业的输出显示效果如图所示。参考答案[rootoldboy scripts]# cat 8_6.sh#! /bin/sh./etc/init.d/functions#引入系统函数库。functionusage(){echo$usage:$0urlexit1}functioncheck_url(){wget--spider-q-o/dev/null--tries1-T5$1if[$?-eq0]thenaction$1is yes./bin/true#这里的action就是在脚本开头引入系统函数库后调用的。elseaction$1is no./bin/falsefi}functionmain(){if[$#-ne1]thenusageficheck_url$1}main $执行效果如下[rootoldboy scripts]# sh 8_6.sh www.oldboedu.com #输入错误地址。www.oldboedu.com is no.[失败][rootoldboy scripts]# sh 8_6.sh www.oldboyedu.comwww.oldboyedu.com is yes.[确定]