shell进阶函数

函数的定义和用途

   函数function是由若干条shell命令组成的语句块,实现shell代码的重用和模块化编程。

   函数和shell程序的异同点

     它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部分 

     区别:

        1.shell程序会启动一个子shell来执行

        2.函数会在当前shell中运行,因此在当前shell中,函数可以对shell中的变量进行修改 (  函数的有效范围是在当前shell   )

     函数的优先级高于内部命令,外部命令,别名. 函数名称如果和以上三种名称冲突,优先函数执行.

     删除函数     执行unset functionname 

     调用函数  functioname    调用时候不要添加()

     全局函数    export  -f  functioname

     匿名函数    cmd1 || {  cmd2;  cmd3; }       后面的 { }    相当于匿名函数

    多个脚本中复用函数

         source     functions(functions表示包含很多个函数的脚本文件)  或者 . functions

         source    /etc/rc.d/init.d/functions

函数变量类型

     1.全局(环境)变量  export

            当前shell和子shell有效 

     2.局部变量(普通变量)

           只在当前shell进程有效,为执行脚本会启动专用子shell进程; 因此,本地变量的作用范围是当前shell脚本程序文件,包括脚本中的函数 

     3.本地变量   local

           函数的生命周期;函数结束时变量被自动销毁 

           declare num 在函数中使用的话   相当于declare local  num    会自带local的特性         declare -g  num  声明为局部变量

      如果函数中有局部变量,如果其名称同本地变量相同,使用局部变量 

函数参数

    传递参数给函数:调用函数时,在函数名后面以空白分隔给定参数列表即可;如“testfunc arg1 arg2 ...”

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

函数返回值

     return  退出函数本身   或者    return 100; 函数的返回值必须是一个数字       return 只能在函数中使用

     $?  获取函数的返回值

    函数有两种返回值:

    函数的执行结果返回值: 

      (1) 使用echo等命令进行输出 

      (2) 函数体中调用命令的输出结果 

   函数的退出状态码: 

         (1) 默认取决于函数中执行的最后一条命令的退出状态码 

         (2) 自定义退出状态码,其格式为: 

              return  从函数中返回,用最后状态命令决定返回值 

              return 0  无错误返回

              return 1-255  有错误返回 

 1 [root@iz2ze6e5pr6sbu9qxhzulaz ~]# fun1(){ return 100;}
 2 [root@iz2ze6e5pr6sbu9qxhzulaz ~]# fun1
 3 [root@iz2ze6e5pr6sbu9qxhzulaz ~]# echo $?
 4 100
 5 [root@iz2ze6e5pr6sbu9qxhzulaz ~]# fun2(){ return "aaa"; }
 6 [root@iz2ze6e5pr6sbu9qxhzulaz ~]# fun2
 7 -bash: return: aaa: numeric argument required
 8 [root@iz2ze6e5pr6sbu9qxhzulaz ~]# echo $?
 9 255
10 [root@iz2ze6e5pr6sbu9qxhzulaz ~]# fun3() { echo 100; }
11 [root@iz2ze6e5pr6sbu9qxhzulaz ~]# fun3
12 100
13 [root@iz2ze6e5pr6sbu9qxhzulaz ~]# echo $?
14 0
View Code
原文地址:https://www.cnblogs.com/yxh168/p/9016441.html