函数详解(function)--shell学习

  • 在其他语言中,我们多次或者经常重复使用的代码片段,会被我们放入一个函数,然后多次引/调用该函数就十分方便了。shell脚本语言也不例外。

  • 我认为,函数是代码自身的第一层抽象封装。

源代码见github:https://github.com/timo1160139211/shellCoding/blob/master/function.sh

函数:function

一、声明函数

两种方式声明函数:

1.”function”不可以省略(bash)

  function find { 
  }

2.不得添加参数

  find() { 
  }

两种声明方式效果等价。
注意

  • 函数名和”{“之间必须有空格,shell对空格变态的敏感
  • 不得声明形式参数
  • 必须在调用前声明
  • 无法重载
  • 后来的声明会覆盖之前的声明
    函数详解(function)--shell学习_第1张图片
    $1 $? 等特殊变量介绍见http://blog.csdn.net/timo1160139211/article/details/77131435

二、调用函数

直接指定函数名即可。一定要注意在声明之后才可以调用

  • 其实函数被调用时会被当作一个小脚本来看待,调用时也可以在函数名后跟参数。
  • 两种方式在调用时都不可以加() :
    • 这里写图片描述

正确的调用方式:

  • 函数详解(function)--shell学习_第2张图片

我们看一下返回结果:

  • 这里写图片描述

三、函数的返回值

既然把函数也当作一个小脚本,那么函数也有退出状态码咯?bingo! 函数运行结束后也会有一个退出状态码。可以用$?变量来显示上一条命令/函数执行结束的退出状态码。退出状态码中,默认的常用状态码这里有介绍->blog<-
当我们不想使用默认的退出状态码时,怎么办呢?当然,shell也为我们提供了return,像其他语言函数中return 一样,不过(整形)返回值必须在0~255之间。否则将会被进行 模256的运算,除此之外return也不可以返回字符串或者其他类型,那么我们想要返回字符串时怎么办呢?我们需要调用函数其他命令去使函数有输出值。

return

我们来看一下return 的使用:

  • 函数的声明
  • 函数的调用
  • 调用结果

那么,我么想要返回字符串时怎么办呢?我们需要这样做:捕获函数的输出到一个变量

函数的输出

我们来看一下函数的输出,函数的输出其实是值得函数中的命令的输出值的总和,我们来看这么一个例子:

  • 函数: 函数体内部一共有三行代码

    • 函数详解(function)--shell学习_第3张图片
  • 调用: 分别是普通调用捕获返回值调用

    • 函数详解(function)--shell学习_第4张图片
  • 返回值:我们用result捕获 ` ` 中运算的结果(即函数的输出)

    • 函数详解(function)--shell学习_第5张图片

从两次调用的结果顺序来看,普通调用按正常顺序输出,而捕获返回值调用则将第1、3行的echo作为函数的输出来对待。所以放在最后输出。

四、在函数中使用变量

参数

函数中使用参数
在上面的例子里我们也了解,函数被视为一个一个小型的脚本看待。那么在传参的时候与脚本一样。

funName var0 var1

直接在函数名称后跟参数即可,在引用的时候用

$1 #调用第一个参数
$n #调用第n个参数(n>0;n=0时变量为当前脚本文件名)
$# #返回参数个数n

全局变量

全局变量指的是在shell脚本中任何(定义后)地方都有效的变量,当然作为shell脚本的配置文件变量–环境变量,自然可以被视为全局变量来使用。

局部变量

局部变量比全局变量的作用范围小。在函数中,作为临时变量就没有必要将作用域声明那么广,以免引起意想不到的冲突。
声明局部变量的方法:(加 local)

local var0

例子:

  • 函数(局部变量)的声明
    • 函数详解(function)--shell学习_第6张图片
  • 函数的调用,全局变量的声明,参数的使用方法
    • 这里写图片描述
  • 运行结果
    • 这里写图片描述

五、创建库

与c的头文件类似,在shell中,也可以定义"库文件",然后再另一个文件中导入。库文件没有特殊声明或者定义,也是脚本文件.sh。

使用库函数的关键在于导入库文件。我们用source来导入,source实际上会在当前shell上下文中执行命令,从而达到导入效果。

source 别名 . (点操作符)

我们来看一个例子:

  • 定义函数:funLib.sh 库文件
    • 函数详解(function)--shell学习_第7张图片
  • 导入库文件,function.sh
    • 函数详解(function)--shell学习_第8张图片
  • 运行结果 bash function.sh
    • 这里写图片描述

从运行结果可以看出,source将funLib.sh引入了function.sh所处的shell上下文中,所以$0显示的都是function.sh文件名。
在funLib.sh文件中声明过的函数在function.sh中可以直接调用,实现了定义和使用分别处理。

六、在 .bashrc中定义函数

向方才讲述的那样使用函数,每次都需要自己去导入定义的库文件。那么,我们可不导入直接使用呢?答案是可以的。方法就是在shell的配置文件.bashrc中声明该函数,因为每次启动shell都会载入.bashrc文件,所以就实现了”自动导入”.


参考资料:

< Linux命令行与shell脚本编程大全 >人民邮电出版社 ISBN-9787115288899

你可能感兴趣的:(Shell编程)