第十六章、Shell 函数
什么是函数
函数是一段具有特定功能的命令块,它允许你为这段命令块定义一个名称(即函数名),并通过这个名称来调用这段命令。
函数一次定义就可以重复调用。
1. 函数的定义和调用
函数定义的官方语法
function name { COMMANDS ; }
# 或者
name () { COMMANDS ; }
将上述一行整理成多行,即成为如下语法:
语法格式:
function 自定义函数名 {
命令块
}
或
自定义函数名 {
命令块
}
语法说明:
- 函数定义是将命令打包在一起,给这些命令取一个名字,供后续使用。
- 函数名的定义方法同变量名一致。
- 函数定义时,内部的命令并不会执行,只有函数在调用时函数内部的命令才会执行。
函数调用的语法
函数名 [参数1] [参数2] ...
语法调用语法说明:
- 函数调用时,程序会跳转到函数定义处,执行函数名对应的函数内部的命令块,当命令块执行完毕后返回到函数调用处继续执行。
- 函数调用时可以向函数传递参数,这些参数需要使用空白字符分隔,在函数内部可以使用位置变量 (
$1、$2、$3等)来获取这些参数值。 - 在函数内部 可是使用
$#变量来获取函数参数的个数。 - 函数内部的 变量:
$#、$1、$2、$3等位置变量时函数内部的局部变量,他不会影响函数外面同名的位置变量的值。
示例:
定义一个控制全自动洗衣机洗衣服流程的函数 washing_machine,用它来提示洗衣服的全过程(这里我们使用 echo 命令代替控制过程)。
washing_machine() {
echo "放入衣服"
echo "注水"
echo "洗涤20分钟"
echo "排水"
echo "甩干"
echo "报警提示完成"
}
函数调用
washing_machine
执行结果
放入衣服
注水
洗涤20分钟
排水
甩干
报警提示完成
上述的洗衣机程序只能洗涤 衣服, 我们可以重新定义 washing_machine 函数,让其能接收一个参数(洗涤的物品)。
改写上述程序,加入一个形参 $1,让此函数能够洗涤不同的衣物。
washing_machine() {
echo "放入 $1"
echo "注水"
echo "洗涤20分钟"
echo "排水"
echo "甩干"
echo "报警提示完成"
}
# 调用函数 washing_machine 并传入对应的参数
washing_machine "羽绒服"
washing_machine "床单"
执行结果
放入 羽绒服
注水
洗涤20分钟
排水
甩干
报警提示完成
放入 床单
注水
洗涤20分钟
排水
甩干
报警提示完成
这样我们的函数就能根据不同的参数执行不同的操作了。
练习:
写一个 函数 is_leap_year, 此函数需要传入一个参数 year 表示年份,这个函数判断这个年份是闰年还是平年,然后打印出来。
闰年有两种情况:
- 能被 400 整除的年份是闰年。
- 能被 4 整除,但不能被 100 整除的年份也是闰年。
- 其他年份是平年。