第一部分:Linux命令行
    《Linux命令行与shell脚本编程大全》 第一章:初识Linux shell
    《Linux命令行与shell脚本编程大全》 第二章:走进shell
    《Linux命令行与shell脚本编程大全》 第三章:基本的bash shell命令
    《Linux命令行与shell脚本编程大全》 第四章:更多的bash shell命令
    《Linux命令行与shell脚本编程大全》 第五章:使用Linux环境变量
    《Linux命令行与shell脚本编程大全》 第六章:理解Linux文件权限
    《Linux命令行与shell脚本编程大全》 第七章:管理文件系统
    《Linux命令行与shell脚本编程大全》 第八章:安装软件程序
    《Linux命令行与shell脚本编程大全》 第九章:使用编辑器

    第二部分:shell脚本编程基础
    《Linux命令行与shell脚本编程大全》 第十章:构建基本脚本
    《Linux命令行与shell脚本编程大全》 第十一章:使用结构化命令
    《Linux命令行与shell脚本编程大全》 第十二章:更多的结构化命令
    《Linux命令行与shell脚本编程大全》 第十三章:处理用户输入
    《Linux命令行与shell脚本编程大全》 第十四章:呈现数据
    《Linux命令行与shell脚本编程大全》 第十五章:控制脚本

    第三部分:高级shell编程
    《Linux命令行与shell脚本编程大全》 第十六章:创建函数
    《Linux命令行与shell脚本编程大全》 第十七章:图形化桌面上的脚本编程
    《Linux命令行与shell脚本编程大全》 第十八章:初识sed和gawk
    《Linux命令行与shell脚本编程大全》 第十九章:正则表达式
    《Linux命令行与shell脚本编程大全》 第二十章:sed进阶
    《Linux命令行与shell脚本编程大全》 第二十一章:gawk进阶
    《Linux命令行与shell脚本编程大全》 第二十二章:使用其他shell

    第四部分:高级shell脚本编程主题
    《Linux命令行与shell脚本编程大全》 第二十三章:使用数据库
    《Linux命令行与shell脚本编程大全》 第二十四章:使用Web
    《Linux命令行与shell脚本编程大全》 第二十五章:使用E-mail
    《Linux命令行与shell脚本编程大全》 第二十六章:编写脚本实用工具
    《Linux命令行与shell脚本编程大全》 第二十七章:shell脚本编程进阶


    第十六章:创建函数

    基本的脚本函数

    创建函数

    1.用function关键字,后面跟函数名

      function name {
        commands
    }
     

    2.函数名后面跟空圆括号,标明正在定义一个函数

      name() {
       commands
    }
     

    如果两个函数的名称相同,那么后面的将会覆盖前面的,而且不会有提示。

    使用函数

    使用函数名称即可。必须先定义,再使用。

      #!/bin/bash
    f1() {
        echo "this is f1."
    }
    f1
    
    function f1 {
        echo "this is f1111."
    }
    f1
    
    f2
    f2() {
        echo "this is f2."
    }
     

    这里首先定义了f1,然后执行,然后又定义了一个f1,再执行。发现第二次执行的是新的f1函数。

    接着调用f2,由于此时f2还没有定义,所以会调用失败。

      $ function_test 
    this is f1.
    this is f1111.
    ./function_test: line 12: f2: command not found
     

    返回值

    bash shell会把函数当做小型脚本,运行结束时会返回一个退出状态码。

    有三种方式生成函数退出状态码

    默认退出状态码

    默认情况下,函数的退出状态码是函数中最后一条命令返回的退出状态码

    函数执行结束后,可以使用$?变量来决定函数的退出状态码

      #!/bin/bash
    fun(){
        ls nothing
        echo $?
        echo "done"
    }
    
    fun
    echo "fun:$?"
     

    由于ls找不到nothing文件或者目录,所以返回的状态码=2

    但是fun函数最后的echo执行成功了,所以fun返回的状态码=0

      $ function_test 
    ls: cannot access nothing: No such file or directory
    2
    done
    fun:0
     

    使用函数默认退出状态码是很危险的……

    使用return命令

    bash shell使用return命令退出函数并返回特定的退出状态码。

    return命令允许指定一个整数值来定义函数的退出状态码

    注意:函数一结束就取返回值,退出状态码必须在0-255之间。

    使用函数输出

    可以将函数的输出保存到变量中,例如:

    result=`f1`

    bash shell不会将read读取输入的部分作为 STDOUT

    在函数中使用变量

    向函数传递参数

    在脚本中指定函数时,必须将参数和函数放在同一行

    然后函数可以用参数环境变量来获得参数值

    在函数中处理变量

    函数会用到全局变量和局部变量。

    全局变量

    在脚本中定义的所有变量均为全局变量。

      #!/bin/bash
    var=1
    fun(){
        echo "var:"$var
        var2=2
    }
    
    fun
    echo "var2:"$var2
     

    输出:

      $ function_test 
    var:1
    var2:2
     

    局部变量

    函数内部任何变量都可以声明为局部变量,只需在变量前加 local 关键字即可。

    在脚本中定义的局部变量,函数中是无法访问的。

    数组变量和函数

    向函数传递数组参数

    需要将数组变量的值分解成单个值,然后作为函数参数使用。

    在函数内部,可以将他们再组成一个数组。

      #!/bin/bash
    array=(a b c d)
    
    fun(){
        newarray=($@) #重新组合为数组
        echo "newarray is:"${newarray[*]} #打印数组
        echo "The 3rd element is:"${newarray[3]}
    }
    
    fun ${array[*]} #拆分成多个值传入
     

    输出:

      $ function_test 
    newarray is:a b c d
    The 3rd element is:d
     

    如果试图将数组当做一个参数传递给函数,那么函数只会读取数组变量的第一个值。

      #!/bin/bash
    array=(a b c d)
    
    fun(){
        echo "We have "$#" parameter(s)."
        echo "They are: "$@
        echo "They are: "$*
    }
    
    fun $array
     

    fun函数只认识数组中的第一个元素

      $ function_test 
    We have 1 parameter(s).
    They are: a
    They are: a
     

    从函数返回数组

      #!/bin/bash
    fun(){
        local array=(a b c d)
        echo ${array[*]}
    }
    
    array=(`fun`)
    echo ${array[2]}
     

    同返回普通字符串类似,按顺序echo输出,然后放在圆括号里面即可。

    函数递归

    还是以最简单的求N的阶乘为例:

      #!/bin/bash
    fun(){
        local result=1;
        if [ $1 -eq 1 ]
        then
            echo 1
        else
            result=$[$1 * `fun $[$1 - 1]`]
            echo $result
        fi
    }
    
    fun $1
     

    没有新的知识点,只是不太熟悉罢了

    如果使用了``,那么函数内的echo就不会输出到STDOUT了,和上面其他的例子一样。

    创建库

    source命令可以在当前的shell上下文中执行命令,而不是创建一个新的shell来执行命令。可以用source命令来在shell脚本中运行库文件脚本。

    source命令等同于点操作符(dot operator)

    在一个名叫lib_test的文件中定义一个plus函数

      #!/bin/bash
    plus(){
        if [ $# -ne 2 ]
        then
            echo "I need 2 numbers!"
            return
        fi
        echo $[$1 + $2]
    }
     

    然后我们在另一个脚本中使用它

      #!/bin/bash
    . lib_test #脚本路径
    plus $1 $2
     

    使用方法很简单,这样就相当于把lib_test导入到当前文件中了

      $ function_test 4 5
    9
     

    在命令行上使用函数

    在命令行上创建函数

    由于在键入命令时shell就会解释命令,所以可以在命令上直接定义函数。

      $ plus(){ echo $[$1 + $2]; }
    $ plus 3 1
    4
     

    注意:要在花括号两边加空格,每条命令用分号隔开。

    下面的方法看起来更实用一些,效果也更好

      $ plus(){
    > echo $[$1 + $2]
    > }
    $ plus 4234 23
    4257
     

    无须分号和空格。

    在.bashrc文件中定义函数

    可以直接在这里定义函数,也可以使用source命令,导入库

    注意,修改了.bashrc之后要重启才能生效

    如果不是每次开机都要执行,那我们还可以在shell中直接使用source,很多时候,这种方式可能更好一些。

    转贴请保留以下链接

    本人blog地址

    http://su1216.iteye.com/

    http://blog.csdn.net/su1216/