5.5 Shell 函数

5.5 Shell 函数

5.5.1 Shell 函数定义

语法格式如下:

function name() {
    statements
    [return value]
}

对各个部分的说明:

  • function 是 Shell 中的关键字,专门用来定义函数;
  • name 是函数名;
  • statements 是函数要执行的代码,也就是一组语句;
  • return value 表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。

简化写法

  • 函数定义时可以不写 function 关键字
  • 写了 function 关键字,也可以省略函数名后面的小括号

5.5.2 函数调用

  • 调用 Shell 函数时可以给它传递参数,也可以不传递。如果不传递参数,直接给出函数名字即可:
name
  • 如果传递参数,那么多个参数之间以空格分隔:
name param1 param2 param3

不管是哪种形式,函数名字后面都不需要带括号。

5.5.3 返回值

shell 中的返回值表示的是函数的退出状态:返回值为 0 表示函数执行成功了,返回值为非 0 表示函数执行失败(出错)了。if 、 while 、 for 等语句都是根据函数的退出状态来判断条件是否成立。

Shell 函数的返回值只能是一个介于 0~255 之间的整数,其中只有 0 表示成功,其它值都表示失败。

函数执行失败时,可以根据返回值(退出状态)来判断具体出现了什么错误,比如一个打开文件的函数,我们可以指定 1 表示文件不存在,2 表示文件没有读取权限,3 表示文件类型不对。

如果函数体中没有 return 语句,那么使用默认的退出状态,也就是最后一条命令的退出状态。如果这就是你想要的,那么更加严谨的写法为:

return $?

$? 是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值,请猛击《 Shell $?》了解更多。
如何得到函数的处理结果?

得到函数的处理结果

有人可能会疑惑,既然 return 表示退出状态,那么该如何得到函数的处理结果呢?比如,我定义了一个函数,计算从 m 加到 n 的和,最终得到的结果该如何返回呢?

这个问题有两种解决方案:

  • 借助全局变量,将得到的结果赋值给全局变量;
  • 函数内部 return 前使用 echo 、 printf 命令将结果输出,在函数外部使用 $() 或者 `` 捕获结果。

5.5.4 模块化

所谓模块化,就是把代码分散到多个文件或者文件夹。对于大中型项目,模块化是必须的,否则会在一个文件中堆积成千上万行代码,这简直是一种灾难。shell 中,我们可以使用 source 命令来实现。

source 命令的用法为:

source filename

也可以简写为:

. filename

两种写法的效果相同。对于第二种写法,注意点号 . 和文件名中间有一个空格。

避免重复引入

我们可以在模块中额外设置一个变量,使用 if 语句来检测这个变量是否存在,如果发现这个变量存在,就 return 出去。

模块文件 module.sh:

if [ -n "$__MODULE_SH__" ]; then
    return
fi

__MODULE_SH__='module.sh'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值