关于shell脚本基础编程第四篇

                                shell脚本基础编程第四篇
本章主要内容:函数

函数
function: 
            function 名称 { 命令 ; } 或 name () { 命令 ;
}
           定义 shell 函数。    
           创建一个以 NAME 为名的 shell
函数。当作为一个简单的命令启用时,
           NAME 函数执行调用 shell 的上下文中的 COMMANDs 命令。当
NAME
           被启用时,参数作为 $1…$n 被传递给函数,函数的名字储存在变量
           $FUNCNAME
中。
           函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程
          
与shell程序形式上是相似的,不同的是他不是一个单的进程,

           不能独立运行,而是shell程序的 一 部分。

           函数由两部分组成:函数名和函数体
语法:
        function f_name
{
                 …函数体..
        }  
语法:
        f_name()
{
                …函数体…
        }

 

函数的定义和使用:
                               
可在交互式环境下定义函数
                               
可将函数放在脚本文件中作为它的一部分
                               
可放在只包含函数的单独文件中
                               
调用:函数只有被调用才会执行
                              
 调用:给定的函数名
                              
 函数名出现的地方,会被自动替换为函数代码
                                函数的生命周期:被调用时创建返回时终止
          

函数返回值:
函数的执行结果返回值:
                                      
使用echo或printf命令进行输出
                                     
 函数体中调用命令的输出结果
       函数的退出状态码:
                                     
 默认取决与函数中执行的最后一条命令的退出状态码 

       自定义退出状态码:
                                       return           
从函数中返回,用最后状态命令决定返回值
                                       return 0        
没有错误返回
                                       return 1-255 有错误返回
==========================================================================  

命令行举例,交互式环境下举例
[root@Compro ~]# function fun1(){ echo "xiaomag";} 
在一行里面要加上;分号
[root@Compro ~]# fun1
xiaomag
定义函数名称为fun1,函数体为输出xiaomag;   
然后直接输入fun1函数名,输出的内容为xiaomag
==========================================================================

shell脚本间简单举例          
[root@Compro
~]# vim fun2.sh

#!/bin/bash
#
#user:Compro
#简单定义函数名称,函数体可以是命令,下面看下几个简单的命令

fun2(){                                                
这个算是在脚本中嵌入了函数
        who
        pwd                                   
          函数一般在文件的前面;调用文件的前面;
        ifconfig                   
                     如果把下面的echo放在最前面,会导致不能调用这个函数;       
       
ls
        hostname                                    
执行后会显示这几条命令的结果返回值
        echo "执行函数fun2结果"         
当所有函数执行结束后,显示打新输入一句话;也可以说是返回值
}
echo "执行函数fun2开始"                 
在这个函数体执行的开始输出显示
fun2
echo "执行函数fun2结束"                  执行上面结果结束后最后显示

函数在使用前必须定义,因此应该将函数定义放在脚本的开始 ,

直到shel首次发现函数体后才能使用;调用函数体仅使用定义好的函数名就可以。
注意:在脚本里面定义的函数,不能在命令行下单独使用,因为不在一个shell进程,两边不想干

========================================================================== 
 set可以产看显示定义的变量。以及函数;
 该定义的函数将一直保留到用户从系统退出,或执行了
unset fun1  取消函数定义    
 
 函数优先级:
                     
别名
                      函数
                    
 内部
                      外部

使用函数文件:
可以将经常使用的函数存入函数文件,然后将函数文件载入shell中。
文件名可任意的选取,但是最好与相关任务有某种联系。
例如:functions.main
==========================================================================[root@Compro
~]# vim funs      创建函数文件
#/bin/bash
fun3(){                          
                函数名
        echo "xiaomag"                 
函数体
}
funn4(){                                        函数名
        edho
"xiaomage"               函数体  

}                                                    可以定义多个函数
==========================================================================

当函数文件定义好以后,需要加载到当前shell才能使用,就可以在命令行或脚本中调用函数,
可以使用set命令查看并检查所有定义的函数,
其输出列表包括已经载入shell的所有函数。
加载函数文件到当前shell:. 
filename 或者 source filename
注意:.点 空格  文件名  这里的文件名要带正确路径

执行shell函数:
[root@Compro ~]# fun3
xiaomag
[root@Compro ~]#
fun4
xiaomage
==========================================================================

若是要改动函数,首先用unset命令从shell中删除函数,改动完毕后,才重新载入此文件。
现在对函数做一些改动。首先删除函数,使其对shell不可用。使用unset命令完成此功能
命令格式为:unset
函数名称
[root@Compro ~]# unset fun4   这样shell中 set就没有个这函数了
==========================================================================

在shell脚本中调用函数文件中的函数
[root@Compro ~]#
vim testfuns.sh    脚本    
#/bin/bash           
source funs       
在脚本里面调用funs函数文件中的函数;如果函数文件要是跟这个脚本不在一个路径下,要写清楚路径
fun3              
函数名
fun4               函数名
==========================================================================

函数参数:
               
传递参数给函数:调用函数时,在函数名后面以空白分隔给定参数列表即可;
                例如 fun1 变量1 变量2

                在函数体当中可使用$1 $2 … 调用这些参数;还可以使用$@,$*,$# 等特殊变量
       

函数变量:
                 环境变量:当前shell和子shell有效
                
本地变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程,
                                    
因此,本地变量的作用范围是当前shell脚本程序文件,包括脚本中的函数
                
局部变量:函数的生命周期;函数结束时变量自动销毁
                
注意:如果函数中有局部变量,如果其名称同本地变量,使用局部变量。

在函数中定义局部变量的方法:
local 变量名=变量值    函数内部有效。不加local是本地变量,加上是局部变量 

 
函数递归:
                 函数直接或间接调用自身
                
注意递归层数
举例
fun (){echo fun;fun;}                             
 死循环,直到一定的程度会退出当前shell终端
fun () { let i++;echo $i;fun;}                  
递增i循环。直到当前系统资源耗尽退出当前shell终端

10!=10*9!=10*9*8!=10*9*8*7!=…

n!=1*2*3….*n
(n-1)!=1*2*3….*(n-1)*n=n!
fun(
echo fun n-1 *
n
)

==========================================================================

vim
fact.sh
#/bin/bash
#
#user:Compro
fact(){    阶乘函数
if [ $1 -eq 0
-o $1 -eq 1 ];then调用 $1等于0    0的阶乘等于1   或者 $1等1  1的阶乘是1
        echo
1如过给的数值是0或者是1就打印1
else如果给的不是0也不是0
        echo "$[ $1*` fact
$[$1-1]`]"$1*调用函数自己$1-1的值 它们的阶乘
fi
}
fact $1通过调用函数的值$1
==========================================================================

执行结果
[root@Compro ~]# bash fact.sh
1
1
[root@Compro ~]# bash fact.sh 2
2
[root@Compro ~]# bash fact.sh
3
6
[root@Compro ~]# bash fact.sh 4
24
[root@Compro ~]# bash -x
fact.sh 4
+ fact 4
+ '[' 4 -eq 0 -o 4 -eq 1 ']'
++ fact 3
++ '[' 3
-eq 0 -o 3 -eq 1 ']'
+++ fact 2
+++ '[' 2 -eq 0 -o 2 -eq 1 ']'
++++
fact 1
++++ '[' 1 -eq 0 -o 1 -eq 1 ']'
++++ echo 1
+++ echo 2
++
echo 6
+ echo 24
24

 

 

原创文章,作者:小马哥,如若转载,请注明出处:http://www.178linux.com/39049

(0)
小马哥小马哥
上一篇 2016-08-24
下一篇 2016-08-24

相关推荐

  • 编程能力与编程年龄

    程序员这个职业究竟可以干多少年,在中国这片神奇的土地上,很多人都说只能干到30岁,然后就需要转型,就像《程序员技术练级攻略》这篇文章很多人回复到这种玩法会玩死人的一样。我在很多面试中,问到应聘者未来的规划都能听到好些应聘都说程序员是个青春饭。因为,大多数程序员都认为,编程这个事只能干到30岁,最多35岁吧。每每我听到这样的言论,都让我感到相当的无语,大家都希…

    Linux干货 2016-08-15
  • Linux内核编译过程详解

    前言 Linux内核是Linux操作系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。Linux内核是单内核设计,但却采用了微内核的模块化设计,支持内核线程以及动态装载内核模块的能力。 Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订…

    Linux干货 2015-04-01
  • tcpdump输出详解

    在这里不得不再吐槽下国内整个IT粗糙浮躁,度娘下来的中文文档几尽抄袭~google下来的文档英文文档质量远高于国内中文文档.用ie或没有安装插件的浏览器访问,不然可能会有其它访问请求数据干扰分析 IP数据包结构 TCP数据包结构 // tcpdump需root权限 # tcpdump -x -i eth1 i…

    Linux干货 2015-04-15
  • 数据结构-栈和队列

    1.栈 1.1 栈的定义 栈是一种特殊的线性表。其特殊性在于限定插入和删除数据元素的操作只能在线性表的一端进行。如下所示: 结论:后进先出(Last In First Out),简称为LIFO线性表。 栈的基本运算有六种: 构造空栈:InitStack(S)、 判栈空: StackEmpty(S)、 判栈满: StackFull(S)、 …

    Linux干货 2015-04-07
  • Linux基础知识—文件系统和常用命令解读

    一、    计算机组成         计算机组成(Computer Composition)指的是计算机系统结构(Computer Architecture)的逻辑实现,包括机器机内的数据流和控制流的组成及逻辑设计等。其任务是在指令集系统结构确定分配给硬件系…

    Linux干货 2016-09-18
  • 设计模式 ( 十五 ) 中介者模式Mediator(对象行为型)

    1.概述 在面向对象的软件设计与开发过程中,根据“单一职责原则”,我们应该尽量将对象细化,使其只负责或呈现单一的职责,即将行为分布到各个对象中。 对于一个模块或者系统,可能由很多对象构成,而且这些对象之间可能存在相互的引用,在最坏的情况下,每一个对象都知道其他所有的对象,这无疑复杂化了对象之间的联系。虽然将一个系统分割成许多对象通常可以增强可复用性,但是对象…

    Linux干货 2015-07-20