• 1.shell函数的定义与调用
  • 2.shell函数参数
  • 3.函数返回值

1.shell函数的定义与调用

Shell 函数定义
说明
函数定义的简化写法
函数调用
function name() {
    statements
    [return value]
}
  • function是 Shell 中的关键字,专门用来定义函数;
  • name是函数名;
  • statements是函数要执行的代码,也就是一组语句;
  • return value表示函数的返回值,其中 return 是 Shell 关键字,专门用在函数中返回一个值;这一部分可以写也可以不写。
  • { }包围的部分称为函数体,调用一个函数,实际上就是执行函数体中的代码。

1.定义函数时不写function关键字

name() {
    statements
    [return value]
}

2.定义时使用function关键字,但省略函数名后的小括号

function name {
    statements
    [return value]
}

  1. 调用函数时可以传递参数,也可以不传递
  • 如果不传递参数,直接给出函数名字即可:name
  • 如果传递参数,那么多个参数之间以空格分隔
  • name param1 param2 param3
  • 不管是哪种形式,函数名字后面都不需要带括号

2. Shell 函数在定义时不能指明参数,但是在调用时却可以传递参数,并且给它传递什么参数它就接收什么参数。

3. Shell 也不限制定义和调用的顺序,你可以将定义放在调用的前面,也可以反过来,将定义放在调用的后面。

实例1 实例2 实例3 知识点

定义一个函数,输出 Shell 教程的地址:

  1. #!/bin/bash
  2. #函数定义
  3. function url(){
  4. echo "http://c.biancheng.net/shell/"
  5. }
  6. #函数调用
  7. url

运行结果:
http://c.biancheng.net/shell/

你可以将调用放在定义的前面,即:

  1. #!/bin/bash
  2. #函数调用
  3. url
  4. #函数定义
  5. function url(){
  6. echo "http://c.biancheng.net/shell/"
  7. }

运行结果:
http://c.biancheng.net/shell/

定义一个函数,计算所有参数的和:

  1. #!/bin/bash
  2. function getsum(){
  3. local sum=0
  4. for n in $@
  5. do
  6. ((sum+=n))
  7. done
  8. return $sum
  9. }
  10. getsum 10 20 55 15 #调用函数并传递参数
  11. echo $?

运行结果:
100

  1. $@表示函数的所有参数,$?表示函数的退出状态(返回值)
  2. 此处使用return 关键字将所有数字的和返回,并使用$?得到这个值,这种方式是错误后,后续内容会进行解释

2.shell函数参数

Shell 中的函数在定义时不能指明参数,但是在调用时却可以传递参数

 
实例1
实例2

函数参数是 Shell 位置参数的一种,在函数内部可以使用$n来接收传递的参数

  • $1 表示第一个参数,$2 表示第二个参数….
  • $#可以获取传递的参数的个数;
  • $@或者$*可以一次性获取所有的参数。

使用 $n 来接收函数参数。

  1. #!/bin/bash
  2. #定义函数
  3. function show(){
  4. echo "Tutorial: $1"
  5. echo "URL: $2"
  6. echo "Author: "$3
  7. echo "Total $# parameters"
  8. }
  9. #调用函数
  10. show C# http://c.biancheng.net/csharp/ Tom

运行结果:
Tutorial: C#
URL: http://c.biancheng.net/csharp/
Author: Tom
Total 3 parameters

使用 $@ 来遍历函数参数

  1. #!/bin/bash
  2. function getsum(){
  3. local sum=0
  4. for n in $@
  5. do
  6. ((sum+=n))
  7. done
  8. echo $sum
  9. return 0
  10. }
  11. #调用函数并传递参数,最后将结果赋值给一个变量
  12. total=$(getsum 10 20 55 15)
  13. echo $total
  14. #也可以将变量省略
  15. echo $(getsum 10 20 55 15)

运行结果:
100
100

数组作为参数传递
arr1=(1 2 3)
echo $arr1只会输出第一个元素1,如果传参数组时直接使用$arr1,同理也只会向函数中传递一个元素
正确方式是把参数写为"${arr1[*]}"才可以作为参数传递

以空格分割的字符串在作为参数传递时,最好也是要用双引号括起来

3.函数返回值

Shell函数返回值,常用的两种方式:return,echo
1) return 语句
return只能用来返回整数值。

3) echo 返回值
在shell中,函数的返回值有一个非常安全的返回方式,即通过输出到标准输出返回。因为子进程会继承父进程的标准输出,因此,子进程的输出也就直接反应到父进程。
但这种方式要注意一点,即不能向标准输出一些不是结果的东西(即不能随便echo一些不需要的信息)

大部分编程语言return 函数结果 在 C++、Java、Python 等大部分编程语言中,返回值是指函数被调用之后,执行函数体中的代码所得到的结果,这个结果就通过 return 语句返回。  
shell return退出状态 Shell 中的返回值表示的是函数的退出状态:返回值为 0 表示函数执行成功了,返回值为非 0 表示函数执行失败(出错)了。if、while、for 等语句都是根据函数的退出状态来判断条件是否成立

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

如果函数体中没有 return 语句,那么使用默认的退出状态,也就是最后一条命令的退出状态。即默认返回为return $?

$?是一个特殊变量,用来获取上一个命令的退出状态,或者上一个函数的返回值。

shell 函数处理结果

获取函数处理结果

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

将函数处理结果赋值给一个全局变量。

  1. #!/bin/bash
  2. sum=0 #全局变量
  1. function getsum(){
  2. for((i=$1; i<=$2; i++)); do
  3. ((sum+=i)) #改变全局变量
  4. done
  5. return $? #返回上一条命令的退出状态
  6. }
  7. read m
  8. read n
  9. if getsum $m $n; then
  10. echo "The sum is $sum" #输出全局变量
  11. else
  12. echo "Error!"
  13. fi

运行结果:
1
100
The sum is 5050

这种方案的弊端是:定义函数的同时还得额外定义一个全局变量,如果我们仅仅知道函数的名字,但是不知道全局变量的名字,那么也是无法获取结果的。

在函数内部使用 echo 输出结果。

  1. #!/bin/bash
  2. function getsum(){
  3. local sum=0 #局部变量
  4. for((i=$1; i<=$2; i++)); do
  5. ((sum+=i))
  6. done
  7. echo $sum
  8. return $?
  9. }
  10. read m
  11. read n
  12. total=$(getsum $m $n)
  13. echo "The sum is $total"
  14. #也可以省略 total 变量,直接写成下面的形式
  15. #echo "The sum is "$(getsum $m $n)

运行结果:
1
100
The sum is 5050

代码中总共执行了两次 echo 命令,但是却只输出一次,这是因为$()捕获了第一个 echo 的输出结果,它并没有真正输出到终端上。除了$(),你也可以使用``来捕获 echo 的输出结果。

这种方案的弊端是:如果不使用$(),而是直接调用函数,会将结果直接输出到终端上。

14 shell 函数的更多相关文章

  1. shell 函数

    1 shell函数的定义及其调用 shell函数有两种格式: function name { commands } name() { commands } 其中,name为函数名,commands为函 ...

  2. shell函数与数组

    shell函数与数组 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为什么要使用shell函数 简单的说函数的作用就是把程序里多次调用的相同的代码部分定义成一份,然后起个名字, ...

  3. shell函数【参数传递及输入输出】&内置函数

    Linux——shell脚本基础3:shell函数[参数传递及输入输出]&内置函数 函数定义 1 退出状态 1 参数传递 2 标准IO 2 脚本调试 2 AND&OR 3 内置命令补充 ...

  4. Shell入门教程:Shell函数详解

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.函数定义 ...

  5. Shell入门教程:Shell函数的返回值

    shell函数返回值一般有3种方式: 1.return语句(默认的返回值) shell函数的返回值可以和其他语言的返回值一样,通过return语句返回. 比如: #!/bin/bash functio ...

  6. (转)Shell函数

    Shell函数类似于Shell脚本,里面存放了一系列的指令,不过Shell的函数存在于内存,而不是硬盘文件,所以速度很快,另外,Shell还能对函数进行预处理,所以函数的启动比脚本更快. 1.  函数 ...

  7. Linux Shell系列教程之(十五) Shell函数简介

    本文是Linux Shell系列教程的第(十五)篇,更多Linux Shell教程请看:Linux Shell系列教程 函数可以将一个复杂功能划分成若干模块,从而使程序结构更加清晰,代码重复利用率更高 ...

  8. Shell函数的简单应用

    Shell函数的简单应用 在脚本内给函数传参: #!/bin/bash . /etc/init.d/functions CheckUrl (){ curl -I -s $ | head - } Che ...

  9. Shell函数语法

    Shell函数语法 定义函数: function   函数名(){ 指令... } 调用函数,方法1: 函数名 调用函数,方法2: 函数名  参数一   参数二 return在函数里面使用会跳出函数并 ...

随机推荐

  1. STM32的时钟系统RCC详细整理(转载)

    一.综述: 1.时钟源 在 STM32 中,一共有 5 个时钟源,分别是 HSI . HSE . LSI . LSE . PLL . ①HSI 是高速内部时钟, RC 振荡器,频率为 8MHz : ② ...

  2. LTC4020

    今天凯哥说他之前有一块电池放电低于20V了 然后接上4020后 会先浮充   涓流充 大约200ma  充过了20V后又是4A了

  3. 企业定制CRM系统的5步流程

    由于所处的行业不同,不同的企业对CRM系统的需求也不同.除了行业通用的功能之外,每个企业都有自己独特的功能需求.为了让CRM系统跟上这种需求的变化,CRM厂商通常也会提供CRM系统定制开发功能来满足不 ...

  4. 在Visual Studio 中使用git——分支管理-上(八)

    在Visual Studio 中使用git--什么是Git(一) 在Visual Studio 中使用git--给Visual Studio安装 git插件(二) 在Visual Studio 中使用 ...

  5. 微服务系列(二)GRPC的介绍与安装

    微服务系列(二)GRPC的介绍与安装 1.GPRC简介 GRPC是Google公司基于Protobuf开发的跨语言的开源RPC框架.GRPC基于HTTP/2协议设计,可以基于一个HTTP/2链接提供多 ...

  6. 『动善时』JMeter基础 — 35、JMeter接口关联【JSON提取器】详解

    目录 1.JSON提取器介绍 2.JSON提取器界面详解 3.JSON提取器的使用 (1)测试计划内包含的元件 (2)HTTP Cookie管理器内容 (3)用户登陆请求界面内容 (4)JSON提取器 ...

  7. typeof的作用及用法

    typeof的作用及用法 1.检查一个变量是否存在,是否有值. typeof在两种情况下会返回"undefined":一个变量没有被声明的时候,和一个变量的值是undefined的 ...

  8. TensorFlow优化器及用法

    TensorFlow优化器及用法 函数在一阶导数为零的地方达到其最大值和最小值.梯度下降算法基于相同的原理,即调整系数(权重和偏置)使损失函数的梯度下降. 在回归中,使用梯度下降来优化损失函数并获得系 ...

  9. NVIDIA Jarvis:一个GPU加速对话人工智能应用的框架

    NVIDIA Jarvis:一个GPU加速对话人工智能应用的框架 Introducing NVIDIA Jarvis: A Framework for GPU-Accelerated Conversa ...

  10. MySQL 5.7.33 超级详细下载安装配置测试教程(可以安装成功版)

    目录 1.引言及注意事项 (1) 引言: (2) 注意: 2.MySQL下载 3.配置环境变量 4.配置my.ini文件(重点) 5.安装MySQL(重点) 6.设置密码 7.测试MySQL是否安装成 ...