Shell函数

172 阅读3分钟

image.png


Shell函数概念

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

Shell函数的优点

  • 使用函数可以避免代码重复
  • 使用函数可以将大的工程分割为若干小的功能模块,代码的可读性更强

Shell函数定义

#方式一:
function 函数名 {
    命令序列
}
#方式二:
函数名() {
    命令序列
}

image.png image.png

函数返回值

return表示退出函数并返回一个退出值,脚本中可以用$?变量显示该值
image.png image.png

使用原则:

  1. 函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
  2. 退出状态码必须是0~255,超出时值将为除以256取余 image.png

由于返回的值有限制,如果值大于255,还是用echo输出值。输出时,结果先赋给一个变量获取函数结果,然后对结果进行输出。 image.png image.png

传递参数的方式

采用位置变量($1、$2、$3...)方式获取脚本命令行传入的参数 image.png image.png

注意

  • 函数体内部的$1、$2...代表的是调用函数时函数后面跟的位置参数
  • 函数体外面的$1、$2...代表的是执行脚本时脚本后面跟的位置参数 image.png image.png

通过用户的输入给脚本传参

image.png image.png

实操一:使用函数输出菱形

使用函数输出菱形,并且可以通过输入数值大小改变菱形的大小

  1. 用函数分别定义输出上半部分和下半部分的函数 image.png image.png

  2. 调用函数,通过read获取参数参给函数 image.png

  3. 完成测试 image.png

函数变量的作用范围

  • 函数在Shell脚本中仅在当前shell环境中有效

  • Shell脚本中变量默认全局有效 image.png image.png

  • 将变量限定在函数内部使用local命令 image.png image.png

递归

函数调用自己本身的函数。
具体来说就是把规模大的问题转化为规模小的相似的子问题来解决。由于解决大问题的方法和解决小问题的方法往往是同一个方法,所以函数就会调用它自身。重要的是,解决问题的函数必须有明显的结束条件,不然就会无限递归。

递归的应用

阶乘

脚本内容: image.png

解析:

  • 判断输入的正整数是否是1,由于1的阶乘就为一,无需计算,直接输出结果即可。 image.png

  • 将获取的变量的数值减一,并将减一后的数值再运用本函数进行阶乘计算,最后该变量乘减一后的阶乘结构,得到最终结果。
    其中,当NUM变量大于0时,会不断调用本身函数,直到NUM为1结束,再不断返回结果。 image.png image.png

  • 主代码中,将函数运行的结果赋给一个变量,输出该变量的值。 image.png

运行结果: image.png

递归目录

脚本内容: image.png

解析:

  • for循环遍历该目录,判断是文件还是目录,如果是目录,再次调用函数本身,直到是文件为止 image.png

  • 如果是文件,就输出为文件 image.png

  • 主代码调用函数 image.png

运行结果: image.png

函数库

shell函数库其实也是一个脚本,其中包含了多个函数,这些函数适用性强,在其他脚本中可直接调出使用。

创建函数库文件

创建一个脚本文件作为函数库,在里面写入一些适用性较高的函数。 image.png

调用函数库文件

由于 . 和source是在当前shell环境运行脚本,所以用这种方式运行函数库文件,在当前脚本中就能直接调用函数库的函数。 image.png image.png