加入收藏 | 设为首页 | 会员中心 | 我要投稿 汽车网 (https://www.0577qiche.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 教程 > 正文

Shell 函数简介

发布时间:2023-06-08 14:06:14 所属栏目:教程 来源:
导读:Shell 和其他语言一样,也有函数,其本质就是一段可以复用的代码。将数据进行抽离处理,传递不同的值输出不同的结果,在指定的地方进行调用即可。

为什么要用函数

如果我们要重复执行一批相同的操作,不想重复
Shell 和其他语言一样,也有函数,其本质就是一段可以复用的代码。将数据进行抽离处理,传递不同的值输出不同的结果,在指定的地方进行调用即可。

为什么要用函数

如果我们要重复执行一批相同的操作,不想重复去写,可以将这一系列操作抽象为一个函数,后期可以利用变量传值调用该函数,从而大大减少重复性劳动,提升效率减少代码量,使得 Shell 脚本更加的灵活和通用。

标准语法
function fnname() { 
statements    return value}

对各个部分的说明:

function 是 Shell 中的关键字,专门用来定义函数;

fname 是函数名;

statements 是函数要执行的代码,也就是一组语句;

return value 表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值,这一部分可以写也可以不写。

由大括号包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。

例如:

function checkuser() { 
echo 当前用户为:$USERreturn 0}
如上就定义了一个 checkuser 函数,其输出当前登录系统的用户名,返回值为 0。

简化语法
函数名后无括号

#简化写法1function fname{ 
statements    return n}
函数不写 function

#简化写法2:fname() {
statements    return n}
上述两种定义函数的方法都可以,但是还是建议在编写 Shell 的时候,也不要浪费这点时间,建议大家都用完整函数定义,写 function 关键字,在为函数定义带上 (),这样更加规范,而且便于别人阅读修改你的脚本。

Tips:在函数定义中需要函数名称后可以有多个空格,括号内也可以有多个空格,如果函数体写在一行,需要在语句末尾加上 ;。

函数调用

当函数定义好了,在需要使用函数的地方,调用其函数名称即可,注意函数调用需要在函数定义之后。

无参数调用

当函数没有参数的时候,调用非常简单,直接写函数名称即可,调用函数就是在特定地方执行函数体内的操作。

// 定义函数function fnname() { 
    statements    return value}// 调用函数
fname

传递参数调用

语法

我们之前在变量一章节介绍了 Shell 脚本的参数,知道了参数的重要性质及其各种类特征,与 Shell 脚本传递参数一样,函数也可以传递参数,例如:

// 定义函数function fnname() { 
    statements    return value}// 调用函数
fname param1 param2 param3
如上所示,在调用函数 fname 的时候,我们传递了三个参数,参数之间利用空格分割,和 Shell 脚本传递参数一样,但需要注意 Shell 脚本中,函数在定义时候不能指定参数,在调用的时候传递参数即可,并且在调用函数时传递什么参数函数就接受什么参数。

函数参数

上述我们了解了函数的定义,在其中无参函数调用即调用函数名即可,对于有参函数,需要传递一定的参数来执行对应的操作,函数的参数和脚本的参数类型及用法一致,在此我们简单回顾下,看参数在函数中都有哪些分类,及该如何使用。

位置参数

位置参数顾名思义,就是传递给函数参数的位置,例如给一个函数传递一个参数,我们可以在执行 Shell 脚本获取对应位置的参数,获取参数的格式为:$n。n 代表一个数字,在此需要注意与脚本传递参数不一样,$0 为依旧为脚本的名称,在函数参数传递中,例如传递给函数的第一个参数获取就为 $1,第 2 个参数就为 $2, 以此类推……,需要其 $0 为该函数的名称。

例如:

[root@master func]# cat f1.sh #!/bin/bashfunction () {
        echo 函数的第一个参数为: ${1}echo 函数的第二个参数为: ${2}echo 函数的第三个参数为: ${3}}# 调用函数
 shell linux python go[root@master func]# bash f1.sh 函数的第一个参数为: shell
函数的第二个参数为: linux
函数的第三个参数为: python
我们可以看到传递给 f1 函数共 4 个位置参数,在结果输出中可以看到由于函数体内部只对三个参数进行了处理,后续的参数也就不再处理了。

特殊参数

在 Shell 中也存在特殊含义的参数如下表:

变量    含义
$#    传递给函数的参数个数总和
$*    传递给脚本或函数的所有参数,当被双引号 包含时,所有的位置参数被看做一个字符串
$@    传递给脚本或函数的所有参数,当被双引号 包含时,每个位置参数被看做独立的字符串
$?    $? 表示函数的退出状态,返回为 0 为执行成功,非 0 则为执行失败
示例:

[root@master func]# cat f1.sh #!/bin/bashfunction fsum() {
        echo 函数第一个参数为: ${1}echo 函数第二个参数为: ${2}echo 函数第三个参数为: ${3}echo 函数的参数总数为: ${#}echo 函数的参数总数为: ${@}local sum=for num in ${@};dolet sum=${sum}+${num}
        done
        echo 计算的总和为: ${sum}return }# 调用函数fsum    
echo $?[root@master func]# bash f1.sh 函数第一个参数为: 
函数第二个参数为: 
函数第三个参数为: 
函数的参数总数为: 
函数的参数总数为:    
计算的总和为:
如上可以看到特殊参数与 Shell 脚本传递参数一样。

Tips:局部变量需要特别声明在函数内部利用 local 关键字来声明。

函数返回值

函数返回值利用 $? 来接收,在上述示例中我们将计算的结果利用 echo 命令打印出来,如果我们在后续的脚本中需要利用此函数计算的结果,就需要得到这个返回值,此刻就需要将计算的结果不仅仅是打印而是返回了,函数中返回利用 return 关键字,在函数调用完成后,我们利用 $? 来接受函数的返回值,例如将我们上面的示例改造成返回结构的函数。

注意:shell 函数的返回值,只能是整形,并且在 0-257 之间,不能是字符串或其他形式。并且在调用方法和取得返回值之间,不能有任何操作,不然取不到 return 的值。

[root@master func]# cat f1.sh #!/bin/bashfunction fsum() {
        echo 函数第一个参数为: ${1}echo 函数第二个参数为: ${2}echo 函数第三个参数为: ${3}echo 函数的参数总数为: ${#}echo 函数的参数总数为: ${@}local sum=for num in ${@};dolet sum=${sum}+${num}
        donereturn $sum
}
 
fsum    
echo $?[root@master func]# bash f1.sh 函数第一个参数为: 
函数第二个参数为: 
函数第三个参数为: 
函数的参数总数为: 
函数的参数总数为:
可以看到我们将在函数内部计算的数组之和,利用 return 作为返回,此刻在函数调用的时候,利用 $? 就可以拿到函数返回的值进一步处理。

递归函数

Shell 支持递归函数,递归函数也就是自己调用自己,即在函数体内部又一次调用函数自己,例如:

[root@master func]# cat recursion.sh #!/bin/bashfunction myecho() {
echo $(date)sleep 
myecho inner}
 
myecho[root@master func]# bash recursion.sh Sat Mar  :: CST 
Sat Mar  :: CST 
Sat Mar  :: CST 
Sat Mar  :: CST 
Sat Mar  :: CST 
...
如上就是一个递归函数,在函数体内部又调用了函数 myecho,在执行的时候就会陷入无限循环。

(编辑:汽车网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章