• 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. 2.1PyCharm 的初始设置

    PyCharm 的初始设置(知道) 目标 恢复 PyCharm 的初始设置 第一次启动 PyCharm 新建一个 Python 项目 设置 PyCharm 的字体显示 PyCharm 的升级以及其他 ...

  2. 若依框架前端使用antd,IE11浏览器无法正常显示问题

    话不多说,直接上才艺,找到vue.config.js,把第11行的 mock 删除掉就 IE11就正常显示了, 然而项目还是不支持IE10 以及以下版本,哪位小伙伴有解决方法,可以留言交流下

  3. 防火墙 firewall iptables

    firewalld FirewallD 使用服务service 和区域zone来代替 iptables 的规则rule和链chain,默认情况下,有以下的区域zone可用: drop – 丢弃所有传入 ...

  4. 给MySQL数据表加入uuid

    alter table table_name add column uuid VARCHAR(255) default "0" update table_name set uuid ...

  5. Question&&Answer

    1.使用Navicat连接Ubuntu上面的MySql数据库失败 解决办法:Navicat版本的问题,尝试换用更高版本的Navicat解决了问题(当时使用了Navicat Premium_11.2.7 ...

  6. libevent中的事件机制

    libevent是事件驱动的网络库,事件驱动是他的核心,所以理解事件驱动对于理解整个网络库有很重要的意义.       本着从简入繁,今天分析下单线程最简单的事件触发.通过sample下的event- ...

  7. GO学习-(24) Go语言操作Redis

    Go语言操作Redis 在项目开发中redis的使用也比较频繁,本文介绍了Go语言中go-redis库的基本使用. Redis介绍 Redis是一个开源的内存数据库,Redis提供了多种不同类型的数据 ...

  8. CodeGen结构循环回路

    CodeGen结构循环回路 structure循环是一个模板文件构造,它允许您迭代CodeGen拥有的有关结构的集合.为了使用结构循环,必须同时基于多个存储库结构生成代码. CodeGen可以通过以下 ...

  9. python_reques接口测试框架,Excel作为案例数据源

    一.框架菜单 1.1 common模块  1.2 其他 二.Excel接口测试案例编写 三.读取Excel测试封装(核心封装) excel_utils.py  读取Excel中的数据 import o ...

  10. wrk(2)- Lua 脚本的使用

    背景 要用 wrk 进行压测 看了下其他同事的压测,都用了 Lua 脚本来自定义一些东西 所以这一篇主要讲 Lua 脚本 Lua 介绍 Lua 脚本是一种轻量小巧的脚本语言,用标准 c 语言编写,并以 ...