欢迎,来自IP地址为:3.145.173.112 的朋友


学习使用函数,也是本次 Bash 基础的最后一节内容。

多数编程语言都具有函数的概念,函数帮助我们避免多次书写重复代码。一旦将一段代码定义为函数,再次需要使用相同功能的代码时,就不需要再次书写同样代码,只需要调用函数即可。

Bash 使用函数

函数定义的格式如下所示:

function_name() {
  commands
}

函数体中的”commands”将在脚本中调用函数时执行,定义时不会执行。

以下是一段比较完整的格式,包括函数的定义与调用:

function_name() {
  commands
}

some_other_commands

#FUNCTION CALL
function_name argument;

需要强调的是,函数在调用之前,必须已经定义完成。

我们编写一段简单的代码来演示函数的调用:

#!/usr/bin/bash

fun() {
	echo "This is a function"
}

echo "This is a script"
fun

可以看到,脚本首先执行脚本中的语句,而会在调用函数时才执行函数定义中的命令。

这个函数并未接收任何参数,而 Bash 脚本中定义的函数是支持参数传递的。

函数传递参数

给函数传递参数的形式同给脚本传递参数的形式一致,调用时使用函数名后接参数值形式:

function_name argument;

示例脚本如下所示:

#!/usr/bin/bash

sum() {
	sum=$(($1+$2))
	echo "The sum of $1 and $2 is: $sum"
}

echo "Let's use the sum function"
sum 1 5

时刻要牢记,传递给脚本的参数同传递给函数的参数是两回事,虽然函数也可以使用脚本的参数,典型示例如下:

#!/usr/bin/bash

arg() {
	echo "1st argument to function is $1 and 2nd is $2"
}

echo "1st argument to script is $1 and 2nd is $2"
arg $2 $1

Bash 函数递归调用

所谓递归调用,是指函数调用函数本身。递归调用功能非常强大,可以让我们写出非常精简的代码。

典型的递归例子是求整数的阶乘,因为 n 的阶乘是 n*(n-1的阶乘),而n-1的阶乘又等于(n-1)(n-2的阶乘),以此类推,就终可以求到1的阶乘为1,从而结束递归。

让我们尝试使用递归来编写一个计算阶乘的脚本:

#!/usr/bin/bash

factorial() {
	
	if [ $1 -gt 1 ]; then
		echo $(( $1 * $(factorial $(( $1 -1 ))) ))
	else
		echo 1
	fi
	
}

echo -n "Factorial of $1 is: "
factorial $1

注意这段代码”echo $(( $1 * $(factorial $(( $1 -1 ))) ))”,代码调用了函数自身,直到1结束,代码会首先计算1的阶乘直到得到正确结果。

脚本执行结果如下:

通过本系列的基本知识的学习,相信大家对于 Bash 脚本有了一定的认识。事实上 bash acel博大精深,可以参考 >>官方手册<< 深入了解。

One thought on “Bash 基础(九):Bash 使用函数”

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注