函数能够将脚本的整体功能分解为更小的、逻辑上的子部分,然后在需要时调用这些子部分来执行它们各自的任务。使用函数执行重复的任务是创建代码重用的一种很好的方法。shell函数类似于其他编程语言中的子程序、过程和函数。本文主要介绍Linux shell脚本中的函数。

1、声明函数

需要声明函数,需使用以下语法:

function_name () { 
   需要执行的命令列表
}

function_name是函数的名称,将使用它在脚本的其他地方调用。函数名后面必须跟圆括号,后面是用大括号括起来的命令列表。

例如,

#!/bin/bash

# 定义函数
MyFunc () {
   echo "linux cjavapy"
echo `date` } # 调用函数 MyFunc

输出:

$ bash demo.sh
linux cjavapy
2021年 10月 07日 星期四 18:18:28 CST

2、函数传参

可以定义一个函数,在调用函数时接受参数。这些参数可以用$1$2等等来表示。

例如,

#!/bin/bash

# 定义函数
MyFunc () {
   echo "linux cjavapy $1"
echo $2`date` } # 调用函数 MyFunc website 当前时间:

输出:

$ bash demo.sh
linux cjavapy website
当前时间:2021年 10月 07日 星期四 18:28:19 CST

注意:上面示例中传递了两个参数,一个是website,另一个是当前时间:

3、函数返回值

从函数内部执行exit命令,其效果不仅是终止函数的执行,而且还终止调用该函数的shell程序的执行。

如果只是想终止函数的执行,可以使用return命令从函数返回任何值,其语法如下所示:

return code

例如,

#!/bin/bash

# 定义函数
MyFunc () {
   echo "linux cjavapy $1"
   echo $2`date` 
   return 1
}

# 调用函数
MyFunc website 当前时间:
ret=$?
echo "返回值是 $ret"

输出:

$ bash demo.sh
linux cjavapy website
当前时间:2021年 10月 07日 星期四 18:47:24 CST
返回值是 1

4、函数嵌套

函数内部可以调用自己,也可以调用其他函数。调用自身的函数称为递归函数。

例如,

#!/bin/bash
# 函数中调用一个函数
func_one () {
   echo "第一个函数执行"
   func_two
}
func_two () {
   echo "第二个函数执行"
}
# 调用函数
func_one

输出:

第一个函数执行
第二个函数执行

5、终端直接调用

可以将常用函数的定义放在.profile中。这些定义将在登录时可用,可以在命令提示符中使用它们。或者,可以将定义到一个文件中,例如,demo.sh,然后执行命令执行,如下,

$ . demo.sh

执行之后demo.sh中定义的函数被读取并定义到当前shell,可以在当前终端的窗口直接调用,如下所示,

$ func_one
第一个函数执行
第二个函数执行

如要从shell中删除函数的定义,使用unset -f命令。

例如,

$ unset -f function_name

注意unset还可以删除变量定义。

推荐文档