zoukankan      html  css  js  c++  java
  • 14 shell 函数

    • 1.shell函数的定义与调用
    • 2.shell函数参数
    • 3.函数返回值

    1.shell函数的定义与调用

    Shell 函数定义
    说明
    函数定义的简化写法
    函数调用
    function name() {
        statements
        [return value]
    }
    • function是 Shell 中的关键字,专门用来定义函数;
    • name是函数名;
    • statements是函数要执行的代码,也就是一组语句;
    • return value表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。
    • { }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。

    1.定义函数时不写function关键字

    name() {
        statements
        [return value]
    }

    2.定义时使用function关键字,但省略函数名后的小括号

    function name {
        statements
        [return value]
    }

    1. 调用函数时可以传递参数,也可以不传递
    • 如果不传递参数,直接给出函数名字即可:name
    • 如果传递参数,那么多个参数之间以空格分隔
    • name param1 param2 param3
    • 不管是哪种形式,函数名字后面都不需要带括号

    2. Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。

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

    实例1实例2实例3知识点

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

    1. #!/bin/bash
    2. #函数定义
    3. function url(){
    4. echo "http://c.biancheng.net/shell/"
    5. }
    6. #函数调用
    7. url

    运行结果:
    http://c.biancheng.net/shell/

    你可以将调用放在定义的前面,即:

    1. #!/bin/bash
    2. #函数调用
    3. url
    4. #函数定义
    5. function url(){
    6. echo "http://c.biancheng.net/shell/"
    7. }

    运行结果:
    http://c.biancheng.net/shell/

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

    1. #!/bin/bash
    2. function getsum(){
    3. local sum=0
    4. for n in $@
    5. do
    6. ((sum+=n))
    7. done
    8. return $sum
    9. }
    10. getsum 10 20 55 15 #调用函数并传递参数
    11. echo $?

    运行结果:
    100

    1. $@表示函数的所有参数,$?表示函数的退出状态(返回值)
    2. 此处使用return 关键字将所有数字的和返回,并使用$?得到这个值,这种方式是错误后,后续内容会进行解释

    2.shell函数参数

    Shell 中的函数在定义时不能指明参数,但是在调用时却可以传递参数

     
    实例1
    实例2

    函数参数是 Shell 位置参数的一种,在函数内部可以使用$n来接收传递的参数

    • $1 表示第一个参数,$2 表示第二个参数….
    • $#可以获取传递的参数的个数;
    • $@或者$*可以一次性获取所有的参数。

    使用 $n 来接收函数参数。

    1. #!/bin/bash
    2. #定义函数
    3. function show(){
    4. echo "Tutorial: $1"
    5. echo "URL: $2"
    6. echo "Author: "$3
    7. echo "Total $# parameters"
    8. }
    9. #调用函数
    10. show C# http://c.biancheng.net/csharp/ Tom

    运行结果:
    Tutorial: C#
    URL: http://c.biancheng.net/csharp/
    Author: Tom
    Total 3 parameters

    使用 $@ 来遍历函数参数

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

    运行结果:
    100
    100

    数组作为参数传递
    arr1=(1 2 3)
    echo $arr1只会输出第一个元素1,如果传参数组时直接使用$arr1,同理也只会向函数中传递一个元素
    正确方式是把参数写为"${arr1[*]}"才可以作为参数传递

    以空格分割的字符串在作为参数传递时,最好也是要用双引号括起来

    3.函数返回值

    Shell函数返回值,常用的两种方式:return,echo
    1) return 语句
    return只能用来返回整数值。

    3) echo 返回值
    在shell中,函数的返回值有一个非常安全的返回方式,即通过输出到标准输出返回。因为子进程会继承父进程的标准输出,因此,子进程的输出也就直接反应到父进程。
    但这种方式要注意一点,即不能向标准输出一些不是结果的东西(即不能随便echo一些不需要的信息)

    大部分编程语言return 函数结果 在 C++、Java、Python 等大部分编程语言中,返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果就通过 return 语句返回。  
    shell return退出状态 Shell 中的返回值表示的是函数的退出状态:返回值为 0 表示函数执行成功了,返回值为非 0 表示函数执行失败(出错)了。if、while、for 等语句都是根据函数的退出状态来判断条件是否成立

    Shell 函数的返回值只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。

    如果函数体中没有 return 语句,那么使用默认的退出状态,也就是最后一条命令的退出状态。即默认返回为return $?

    $?是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。

    shell 函数处理结果

    获取函数处理结果

      • 一种是借助全局变量,将得到的结果赋值给全局变量;
      • 一种是在函数内部使用 echo、printf 命令将结果输出,在函数外部使用$()或者``捕获结果
     
     实例1实例2
     

    将函数处理结果赋值给一个全局变量。

    1. #!/bin/bash
    2. sum=#全局变量
    1. function getsum(){
    2. for((i=$1; i<=$2; i++)); do
    3. ((sum+=i)) #改变全局变量
    4. done
    5. return $? #返回上一条命令的退出状态
    6. }
    7. read m
    8. read n
    9. if getsum $m $nthen
    10. echo "The sum is $sum" #输出全局变量
    11. else
    12. echo "Error!"
    13. fi

    运行结果:
    1
    100
    The sum is 5050

    这种方案的弊端是:定义函数的同时还得额外定义一个全局变量,如果我们仅仅知道函数的名字,但是不知道全局变量的名字,那么也是无法获取结果的。

    在函数内部使用 echo 输出结果。

    1. #!/bin/bash
    2. function getsum(){
    3. local sum=#局部变量
    4. for((i=$1; i<=$2; i++)); do
    5. ((sum+=i))
    6. done
    7. echo $sum
    8. return $?
    9. }
    10. read m
    11. read n
    12. total=$(getsum $m $n)
    13. echo "The sum is $total"
    14. #也可以省略 total 变量,直接写成下面的形式
    15. #echo "The sum is "$(getsum $m $n)

    运行结果:
    1↙
    100↙
    The sum is 5050

    代码中总共执行了两次 echo 命令,但是却只输出一次,这是因为$()捕获了第一个 echo 的输出结果,它并没有真正输出到终端上。除了$(),你也可以使用``来捕获 echo 的输出结果。

    这种方案的弊端是:如果不使用$(),而是直接调用函数,会将结果直接输出到终端上。

  • 相关阅读:
    Setting a maximum attachment size
    一机多屏,屏幕顺序容易错?
    node.js " The requested service provider could not be loaded or initialized"
    VS2008中MFC对话框界面编程Caption中文乱码的解决办法
    The application was unable to start correctly (0xc000007b)
    FreeType的项目总是报error LNK2019: unresolved external symbol __imp错误
    MFC对话框:模态对话框及其弹出过程
    MFC如何获取硬盘的序列号
    SharePoint CAML Query小结
    ECS Navicat for MySQL远程连接报10038的错误
  • 原文地址:https://www.cnblogs.com/mianbaoshu/p/12069604.html
Copyright © 2011-2022 走看看