语法
函数声明
function fn() {
command
# 函数的返回值是可选的
[return value]
}
# 如果写了function关键字,也可以省略函数名后面的小括号
function name {
command
# 函数的返回值是可选的
[return value]
}
# 部分shell支持function关键字,不支持function关键字时可以不写
name() {
command
# 函数的返回值是可选的
[return value]
}
shell也不限制定义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面
函数参数
和其它编程语言不同的是,shell函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数
在函数内部可以使用$n来接收
- $1 表示第一个参数
- $2 表示第二个参数
- 依次类推
除了$n,还有另外三个比较重要的变量
- $# 保存参数的个数
- $* 以一个单字符串的形式保存所有参数
- $@ 与 ∗ 同 样 是 以 一 个 单 字 符 串 的 形 式 保 存 所 有 参 数 。 但 也 有 不 同 之 处 ( 详 见 * 同样是以一个单字符串的形式保存所有参数。但也有不同之处(详见 ∗同样是以一个单字符串的形式保存所有参数。但也有不同之处(详见@ 和 $* 的区别)
函数返回值
shell中的返回值表示的是函数的退出状态,if、while、for等语句都是根据函数的退出状态来判断条件是否成立
- 返回值为0表示函数执行成功
- 返回值为非0表示函数执行失败(出错)
- 返回值只能是一个介于0~255之间的整数,其中只有0表示成功,其它值都表示失败
函数的返回值是可选的
- 如果函数体中没有return语句,那么使用默认的退出状态,也就是最后一条命令的退出状态
# $? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值
return $?
获取函数处理结果
既然return表示退出状态,那么该如何得到函数的处理结果呢?比如,定义了一个函数,计算从m加到n的和,最终得到的结果该如何返回呢?
这个问题有两种解决方案:
- 一种是借助全局变量,将得到的结果赋值给全局变量
- 一种是在函数内部使用echo、printf命令将结果输出,然后在函数外部使用 $(fn) 或者 `fn` 捕获结果
函数调用
调用shell函数时可以给它传递参数,也可以不传递。不管是哪种形式,函数名字后面都不需要带括号
# 如果不传递参数,直接给出函数名字即可
fn
# 如果传递参数,那么多个参数之间以空格分隔
fn param1 param2 ... paramN
示例
#!/bin/bash
getsum() {
local sum=0
for ((i = $1; i <= $2; i++)); do
((sum += i))
done
echo $sum
return 100
}
read -p "input the first number: " m
read -p "input the second number: " n
echo "the sum is $(getsum $m $n) with return val $?"