Shell脚本编程(12)之基本的脚本函数

Shell脚本编程(12)之基本的脚本函数

微信搜索 zze_coding 或扫描 👉 二维码关注我的微信公众号获取更多资源推送:

本部分内容参考自《Linux命令行与shell脚本编程大全 第3版》。

在编写 shell 脚本时,你经常会发现在多个地方使用了同一段代码。如果只是一小段代码,一般也无关紧要。但要在 shell 脚本中多次重写大块代码段就太累人了。 bash shell 提供的用户自定义函数功能可以解决这个问题。可以将 shell 脚本代码放进函数中封装起来,这样就能在脚本中的任何地方多次使用它了。

基本的脚本函数

在开始编写较复杂的 shell 脚本时,你会发现自己重复使用了部分能够执行特定任务的代码。
这些代码有时很简单,比如显示一条文本消息,或者从脚本用户那里获得一个答案;有时则会比较复杂,需要作为大型处理过程中的一部分被多次使用。
在后一类情况下,在脚本中一遍又一遍地编写同样的代码会很烦人。如果能只写一次,随后在脚本中可多次引用这部分代码就好了。
bash shell 提供了这种功能。 函数是一个脚本代码块,你可以为其命名并在代码中任何位置重用。要在脚本中使用该代码块时,只要使用所起的函数名就行了(这个过程称为调用函数)。
本节将会介绍如何在 shell 脚本中创建和使用函数。

创建函数

有两种格式可以用来在 bash shell 脚本中创建函数。第一种格式采用关键字 function,后跟分配给该代码块的函数名。

function name {
    commands
}

name 属性定义了赋予函数的唯一名称。脚本中定义的每个函数都必须有一个唯一的名称。
commands 是构成函数的一条或多条 bash shell 命令。在调用该函数时, bash shell 会按命令在函数中出现的顺序依次执行,就像在普通脚本中一样。
在 bash shell 脚本中定义函数的第二种格式更接近于其他编程语言中定义函数的方式。

name() {
    commands
}

函数名后的空括号表明正在定义的是一个函数。这种格式的命名规则和之前定义 shell 脚本函数的格式一样。

使用函数

要在脚本中使用函数,只需要像其他shell命令一样,在行中指定函数名就行了。

$ cat test1.sh 
#########################################################################
# File Name: test1.sh
# Author:zze
# Mail:zhangzhongen326@gmail.com
# Create Time:2019-12-24 08:24:37
# Description: 
#########################################################################
#!/bin/bash
function func1 {
echo "This is an example of a function"
}
count=1
while [ $count -le 5 ]
do
	func1
	count=$[ $count + 1 ]
done
echo "This is the end of the loop"
func1
echo "Now this is the end of the script"
$ ./test1.sh 
This is an example of a function
This is an example of a function
This is an example of a function
This is an example of a function
This is an example of a function
This is the end of the loop
This is an example of a function
Now this is the end of the script

每次引用函数名 func1 时, bash shell 会找到 func1 函数的定义并执行你在那里定义的命令。
需要注意的:

  1. 使用函数前一定要先定义函数,否则你会收到一条错误消息。
  2. 必须注意函数名。记住,函数名必须是唯一的,否则也会有问题。如果你重定义了函数,新定义会覆盖原来函数的定义,这一切不会产生任何错误消息。

练习

1、求 n 的阶乘。

#!/bin/bash
#
fact(){
	if [ $1 -eq 0 -o $1 -eq 1 ];then
		echo 1
	else
		echo $[$1*$(fact $[$1-1])]
	fi
}
fact $1

Copyright: 采用 知识共享署名4.0 国际许可协议进行许可

Links: https://www.zze.xyz/archives/shell-12.html

Buy me a cup of coffee ☕.