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

本文主要讲解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<<- EOF
> ywxi() {
>     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]


猜你喜欢

转载自blog.51cto.com/13707680/2125349