• shell--(九)Shell函数


    原文:https://www.runoob.com/linux/linux-shell-func.html

    Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可。


    Shell 中的函数和C++JavaPythonC# 等其它编程语言中的函数类似,只是在语法细节有所差别。

    Shell 函数定义的语法格式如下:

    function name() {
        statements
        [return value]
    }

    对各个部分的说明:

    • function是 Shell 中的关键字,专门用来定义函数;
    • name是函数名;
    • statements是函数要执行的代码,也就是一组语句;
    • return value表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。


    { }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。

    一、函数定义的简化写法

    如果你嫌麻烦,函数定义时也可以不写 function 关键字:

    name() {
        statements
        [return value]
    }

    如果写了 function 关键字,也可以省略函数名后面的小括号:

    function name {
        statements
        [return value]
    }

    建议使用标准的写法,这样能够做到“见名知意”,一看就懂。

    二、函数调用

    调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:

    name

    如果传递参数,那么多个参数之间以空格分隔:

    name param1 param2 param3

    不管是哪种形式,函数名字后面都不需要带括号。

    和其它编程语言不同的是,Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。

    Shell 也不限制定义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。

    实例:

    1) 定义一个函数,输出 Shell 教程的地址:

    #!/bin/bash
    #函数定义
    function url(){
        echo "http://c.biancheng.net/shell/"
    }
    #函数调用
    url
    
    
    运行结果:
    http://c.biancheng.net/shell/
    
    ==================
    你可以将调用放在定义的前面

    2) 定义一个函数,计算所有参数的和:

    #!/bin/bash
    function getsum(){
        local sum=0
        for n in $@
        do
             ((sum+=n))
        done
        return $sum
    }
    getsum 10 20 55 15  #调用函数并传递参数
    echo $?

    运行结果:
    100

    $@表示函数的所有参数,$?表示函数的退出状态(返回值)。

    三、Shell函数参数

    和C++、C#、Python 等大部分编程语言不同,Shell 中的函数在定义时不能指明参数,但是在调用时却可以传递参数。

    函数参数是 Shell位置参数的一种,在函数内部可以使用$n来接收,例如,$1 表示第一个参数,$2 表示第二个参数,依次类推。

     除了$n,还有另外三个比较重要的变量:

    • $#可以获取传递的参数的个数;
    • $@或者$*可以一次性获取所有的参数

    (1)带参数的函数示例:

    #!/bin/bash
    
    funWithParam(){
        echo "第一个参数为 $1 !"
        echo "第二个参数为 $2 !"
        echo "第十个参数为 $10 !"
        echo "第十个参数为 ${10} !"
        echo "第十一个参数为 ${11} !"
        echo "参数总数有 $# 个!"
        echo "作为一个字符串输出所有参数 $* !"
    }
    funWithParam 1 2 3 4 5 6 7 8 9 34 73

    输出结果:

    第一个参数为 1 !
    第二个参数为 2 !
    第十个参数为 10 !
    第十个参数为 34 !
    第十一个参数为 73 !
    参数总数有 11 个!
    作为一个字符串输出所有参数 1 2 3 4 5 6 7 8 9 34 73 !

    注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数。

    (2)实例2:使用 $@ 来遍历函数参数。

    定义一个函数,计算所有参数的和:

    #!/bin/bash
    function getsum(){
        local sum=0
        for n in $@
        do
             ((sum+=n))
        done
        echo $sum
        return 0
    }
    #调用函数并传递参数,最后将结果赋值给一个变量
    total=$(getsum 10 20 55 15)
    echo $total
    #也可以将变量省略
    echo $(getsum 10 20 55 15)

    运行结果:
    100
    100

    3)其他特殊字符用来处理参数:

    参数处理说明
    $# 传递到脚本或函数的参数个数
    $* 以一个单字符串显示所有向脚本传递的参数
    $$ 脚本运行的当前进程ID号
    $! 后台运行的最后一个进程的ID号
    $@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。
    $- 显示Shell使用的当前选项,与set命令功能相同。
    $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

    四、return返回值

    1. 有return

    (1)¥?获取return返回值

    #!/bin/bash
    function demoFun1(){
        echo "这是我的第一个 shell 函数!"
        return `expr 1 + 1`
    }
    
    demoFun1
    echo $?
    这是我的第一个 shell 函数!
    2

    (2)$? 仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再能通过 $? 获得

    #!/bin/bash
    
    function demoFun1(){
        echo "这是我的第一个 shell 函数!"
        return `expr 1 + 1`
    }
    
    demoFun1
    echo $?  #调用函数后立即获取返回值,可以获取返回值
    echo $?  #调用函数后,上面已经执行其他命令,获取不到函数调用的返回值,而是获取到的上一条命令的执行结果(0代表上一条命令echo $?执行的结果)

    执行结果:

    这是我的第一个 shell 函数!
    2
    0

    2. 没有return

    shell如果没有return,默认retur 0

    shell 语言中 0 代表 true,0 以外的值代表 false。

    3. 函数与命令的执行结果可以作为条件语句使用。

    1. 打印返回结果

    实例1:

    #!/bin/bash
    
    echo "Hello World !" | grep -e Hello
    echo $?
    
    
    运行结果:
    Hello World !
    0

    实例2:

    echo "Hello World !" | grep -e Bye
    echo $?
    
    运行结果:
    1

    grep 是从给定字符串中寻找匹配内容的命令。首先看出如果找到了匹配的内容,会打印匹配部分且得到的返回值 $? 为 0,如果找不到,则返回值 $? 为 1。

    2. 返回值当if条件判断

    #!/bin/bash
    
    if echo "Hello World !" | grep -e Hello
    then
        echo true
    else
        echo false
    fi
    
    if echo "Hello World !" | grep -e Bye
    then
        echo true
    else
        echo false
    fi
    
    
    运行结果:
    Hello World !
    true
    false

    分别将这两次执行的 grep 命令当作条件语句交给 if 判断,得出返回值 $? 为 0,即执行成功时,条件语句为 true,当返回值 $? 为 1,即执行失败时,条件语句为 false。

    ========

    #!/bin/bash
    
    function demoFun1(){
        return 0
    }
    
    function demoFun2(){
        return 12
    }
    
    if demoFun1
    then
        echo true
    else
        echo false
    fi
    
    if demoFun2
    then
        echo ture
    else
        echo false
    fi

    用函数的 return 值作为测试,其中 demoFun1 返回值为 0,demoFun2 返回值选择了任意一个和 0 不同的整数,这里为 12。

    将函数作为条件语句交给 if 判断,得出返回值为 0 时,依然为 true,而返回值只要不是 0,条件语句都判断为 false。

  • 相关阅读:
    MD5 初探。
    VFW程序分析
    IE版本简单兼容 JS闭包和JS对象解说。
    句柄和指针
    超时时间已到。在从池中获取连接之前超时时间已过。出现这种情况可能是因为所有池连接都已被使用并已达到最大池大小
    DataGrid模板列上的ImageButton 不能触发ItemCommand事件
    html转换成文本
    几种取数据库随机记录的方法
    打开.net时CPU占用率100%的问题个人处理办法
    强制输出wxl
  • 原文地址:https://www.cnblogs.com/zhzhlong/p/12549531.html
Copyright © 2020-2023  润新知