创建函数

#创建函数的意义在于避免代码的重复编写
#函数的创建以及使用

基本的脚本函数
    创建函数的2种格式:
        ①
        function  name {  
        commands
        }
        ②
        name () {
        commands
        }
    函数的使用
        $
        function func1 {
            echo "This is an example of a function"
        }
        count=1
        while [ $count -le 5 ]
        do
            func1
            count=$[ $count + 1 ]
        done
        function func1 {                    -- 同名函数func1的定义将覆盖之前的函数
            echo "This is an same function"
        }        
        echo "This is the end of the loop"
        func1
        echo "Now this is the end of the script $?"    -- $? 改变量可以查看函数退出状态码,为0表示函数最后一行代码执行成功
        $
    返回值
        避免使用函数的默认状态码(return)
            $
            function dbl {
                read -p "Enter a value: " value
                echo "doubling the value"
                return $[ $value * 2 ]
            }
            dbl
            echo "The new value is $?"  -- 注意2点:函数一结束就取返回值;退出状态码必须是0~255。
            $
        使用函数输出
            $
            function dbl {
                read -p "Enter a value: " value
                echo $[ $value * 2 ]
            }
            result=$(dbl)  -- 该脚本会获取 dbl 函数的输出,而不是查看退出状态码
            echo "The new value is $result"
            $
    在函数中使用变量            
        传递参数
            #sh sw_cs.sh 10 15
            $
            function func7 {     
                echo $[ $1 * $2 ]
            }
            if [ $# -eq 2 ]
            then
                value=$(func7 $1 $2)  -- 向函数传递变量(函数符合位置变量标准,如func7 10 23,但函数不能直接使用脚本的变量)
                echo "The result is $value"
                else
                echo "Usage: badtest1 a b"
            fi
            $
        脚本全局变量与脚本局部变量
            $
            function func1 {
                local temp=$[ $value + 5 ]  -- local定义了该变量作为脚本局部变量,不会覆盖脚本全局变量的值。作用域只在改函数。
                result=$[ $temp * 2 ]
            }
            temp=4
            value=6
            func1
            echo "The result is $result"
            if [ $temp -gt $value ]
            then
                echo "temp is larger"  -- The result is 22
            else
                echo "temp is smaller"  -- temp is smaller 
            fi
            $
    数组变量参数的处理
        传递数组参数
            $
            function testit {
                local newarray
                newarray=(;'echo "$@"')    -- 将数组参数变量打印,否则只会读取第一个
                echo "The new array value is: ${newarray[*]}"
            }
            myarray=(1 2 3 4 5) 
            echo "The original array is ${myarray[*]}"  -- The original array is 1 2 3 4 5
            testit ${myarray[*]}  -- The new array value is: 1 2 3 4 5
            $
            function addarray {
                local sum=0
                local newarray
                newarray=($(echo "$@"))
                for value in ${newarray[*]}
                do
                    sum=$[ $sum + $value ]
                done
                echo $sum
            }
            myarray=(1 2 3 4 5)
            echo "The original array is: ${myarray[*]}"
            arg1=$(echo ${myarray[*]})
            result=$(addarray $arg1)
            echo "The result is $result"    -- The result is 15,addarray 函数会遍历所有的数组元素,将它们累加在一起
            $
        返回数组
            function arraydblr {
                local origarray
                local newarray
                local elements
                local i
                origarray=($(echo "$@"))
                newarray=($(echo "$@"))
                elements=$[ $# - 1 ]
                for (( i = 0; i <= $elements; i++ ))
                {
                    newarray[$i]=$[ ${origarray[$i]} * 2 ]    -- 将数组origarray[$i]的该位置参数作为变量的值
                }
                echo ${newarray[*]}
            }
            myarray=(1 2 3 4 5)
            echo "The original array is: ${myarray[*]}"
            arg1=$(echo ${myarray[*]})
            result=($(arraydblr $arg1))
            echo "The new array is: ${result[*]}"    -- The new array is: 2 4 6 8 10
    函数递归
        $
        function factorial {
            if [ $1 -eq 1 ]
            then
                echo 1
            else
                local temp=$[ $1 - 1 ]
                local result=$(factorial $temp)
                echo $[ $result * $1 ]
            fi
        }
        read -p "Enter value: " value
        result=$(factorial $value)
        echo "The factorial of $value is: $result"
        $        
脚本中使用其他脚本函数(source)
    创建库(实现脚本中调用其他脚本中函数)
        $
        function addem {
            echo $[ $1 + $2 ]
        }
        function multem {
            echo $[ $1 * $2 ]
        }
        function divem {
            if [ $2 -ne 0 ]
            then
                echo $[ $1 / $2 ]
            else
                echo -1
            fi
        }
        $
        $
        source myfuncs.sh  -- 用 source 命令来在shell脚本中运行库文件脚本,相当于将两个脚本合并成一个
        value1=10
        value2=5
        result1=$(addem $value1 $value2)
        result2=$(multem $value1 $value2)
        result3=$(divem $value1 $value2)
        echo "The result of adding them is: $result1"  -- 15
        echo "The result of multiplying them is: $result2"  -- 50
        echo "The result of dividing them is: $result3"  -- 2
        $
命令行上使用函数
    命令行上直接创建函数(临时创建)
        $ function divem { echo $[ $1 / $2 ]; }  -- 每条命令结束需要分号
        $ divem 100 5
        $
        $ function multem {
        > echo $[ $1 * $2 ]  -- 多行创建不需要分号
        > }
        $ multem 2 5
    在.bashrc 文件中定义函数(永久创建,重启了shell可用。使用是不需要定义,可以直接使用函数)
        1. 直接定义函数
            $ cat .bashrc
            # .bashrc
            # Source global definitions
            if [ -r /etc/bashrc ]; then
            . /etc/bashrc
            fi
            function addem {   -- 该addem函数是追加的函数
            echo $[ $1 + $2 ]
            }
            $
        2. 读取函数文件
            $ cat .bashrc
            # .bashrc
            # Source global definitions
            if [ -r /etc/bashrc ]; then
            . /etc/bashrc
            fi
            . /home/rich/libraries/myfuncs  -- 该脚本文件myfuncs为追加的,使用了source命令以便和其他脚本合并。
            $
实例
    下载及安装GNU shtool库
        地址:ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz
        复制到主目录中(cp)
        使用tar提取:tar -zxvf shtool-2.0.8.tar.gz
    构建库
        $ ./confifgure    -- configure 命令会检查构建shtool库文件所必需的软件
        $ make    -- make 命令负责构建shtool库文件
        $ make test    -- 测试模式会测试shtool库中所有的函数是否通过
        $ make install    -- 安装到linux的公共环境(若测试都通过)
    shtool 库函数
        函 数         描 述
        Arx         创建归档文件(包含一些扩展功能)
        Echo        显示字符串,并提供了一些扩展构件
        fixperm     改变目录树中的文件权限
        install     安装脚本或文件
        mdate       显示文件或目录的修改时间
        mkdir       创建一个或更多目录
        Mkln        使用相对路径创建链接
        mkshadow    创建一棵阴影树
        move        带有替换功能的文件移动
        Path        处理程序路径
        platform    显示平台标识
        Prop        显示一个带有动画效果的进度条
        rotate      转置日志文件
        Scpp        共享的C预处理器
        Slo         根据库的类别,分离链接器选项
        Subst       使用sed的替换操作
        Table       以表格的形式显示由字段分隔(field-separated)的数据
        tarball     从文件和目录中创建tar文件
        version     创建版本信息文件
        shtool库函数的使用格式:
            shtool [options] [function [options] [args]]
    使用shtool库
        $ ls –al /usr/bin | shtool prop –p "waiting..."  -- 使用shtool的prop函数
        waiting...
        $

 

posted on 2019-07-17 10:32  丿星痕☆森文  阅读(282)  评论(0编辑  收藏  举报

导航