• 创建函数


    #创建函数的意义在于避免代码的重复编写
    #函数的创建以及使用
    
    基本的脚本函数
        创建函数的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...
            $
    生活就要逢山开路遇水搭桥,愿共勉!
  • 相关阅读:
    (转载)SAPI 包含sphelper.h编译错误解决方案
    C++11标准的智能指针、野指针、内存泄露的理解(日后还会补充,先浅谈自己的理解)
    504. Base 7(LeetCode)
    242. Valid Anagram(LeetCode)
    169. Majority Element(LeetCode)
    100. Same Tree(LeetCode)
    171. Excel Sheet Column Number(LeetCode)
    168. Excel Sheet Column Title(LeetCode)
    122.Best Time to Buy and Sell Stock II(LeetCode)
    404. Sum of Left Leaves(LeetCode)
  • 原文地址:https://www.cnblogs.com/TianMu/p/11199389.html
Copyright © 2020-2023  润新知