一、什么是Bash函数

Bash不支持goto语句,可以用function实现程序流程跳转。
当前shell中一组组织在一起并被命名的命令。
比脚本的效率高,一旦定义,就成为shell内存的一部分,可以随时被调用,不必从文件中读取。

二、函数定义

两种定义方式:
1、函数名 +() + 定义
2、funciton + 函数名 + () + 定义,()可选
function func () {

statements
return 1;

}
第一个花括号两边的空格是必须的。

三、函数返回值

1、如果使用函数返回值,return只能返回一个整数(0~255),不能返回字符串,且返回值保存在$?变量中,不能直接赋值给其它变量
例如,下面获得函数返回值的写法是错误的

function func () { return 3; }
i=`func`

2、如果return没有指定参数,则是最后一行脚本的退出状态值

3、如果要将函数返回值赋值给一个变量,有两种方式:
a)用$?赋值

func
i=$?

b)在函数中,用echo打印返回值,再赋值

function func () { echo 3; }
i=`func`

四、函数参数

1、向函数传递的参数被当作位置参量来处理,在函数中是本地变量
2、函数参数用$1, $2 ,..., $n来表示,但和通过命令行传递给脚本的参数不同。调用方式如下:

func param1 param2

3、如果函数中要使用脚本的参数,只能将脚本的参数作为函数的参数传递给函数,例如,可以将脚本的第1个参数$1作为函数的第2个参数传给函数,那么函数则通过$2来访问脚本的第1个参数

$ function welcome { echo "Hi, $1 and $2"; }
$ welcome tom joe
Hi,tom and joe
$ set cb panda ; echo $*
cb panda
$ welcome tom joe
Hi,tome and joe
$ echo $1 $2
cb panda

五、函数中的变量和陷阱

1、在一个shell中的变量无局部和全局之分,随用随声明,无作用域的概念。例如,在一个if...fi块中定义的变量,出了这个块的作用域仍然有效。这也说明BASH不适合编写大的复杂的程序
2、和变量一样,函数内部的陷阱是全局的
3、函数中可以定义局部变量,出了函数无效,使用local来定义

func() {
local count
echo $count
}

六、函数调用

1、使用function只是定义函数,要执行函数中的命令必须在脚本中或命令行上调用函数,例如:$ func param1 param2
a) 将函数单独放入一个脚本里,再在命令行上执行脚本(直接执行,或使用.,或source),是不会执行函数里的命令的
b) 将函数单独放入一个脚本,然后执行,相当于在执行该脚本的shell环境中定义了该函数
例如:下面的命令只是在shell环境中定义函数,并不会调用函数
$ ./func_script.sh

$source ./func_script.sh

2、函数可以递归:函数可以自己调用自己,调用次数没有限制

3、函数中使用exit命令退出整个脚本。

七、常用命令

1、查看定义了哪些函数
$declare -f
$declare -F //只列出函数名

2、撤消函数定义
$unset func_name

3、将函数输出给子shell
$export -f func_name

=-=-=-=-=
Powered by Blogilo

Bash函数的更多相关文章

  1. 一些方便系统诊断的bash函数

    原文地址:一些方便系统诊断的bash函数 一些方便系统诊断的bash函数:http://hongjiang.info/common-bash-functions/ 这段脚本包含100多个bash函数, ...

  2. bash函数定义/使用/传参…

    函数:function, 功能     过程式编程,代码重用         模块化编程         简洁             语法:         function f_name {    ...

  3. Bash函数使用

    #!/bin/bash function Fun_Name() { #function here echo "this is a function" } Fun_Name

  4. Bash脚本编程学习笔记08:函数

    官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在<Bash脚本编程学习笔记06:条件结构体>中最后所说的,我们应该把一些可能反复执 ...

  5. CVE: 2014-6271、CVE: 2014-7169 Bash Specially-crafted Environment Variables Code Injection Vulnerability Analysis

    目录 . 漏洞的起因 . 漏洞原理分析 . 漏洞的影响范围 . 漏洞的利用场景 . 漏洞的POC.测试方法 . 漏洞的修复Patch情况 . 如何避免此类漏洞继续出现 1. 漏洞的起因 为了理解这个漏 ...

  6. 脚本命令高级Bash脚本编程指南(31):数学计算命令

    题记:写这篇博客要主是加深自己对脚本命令的认识和总结实现算法时的一些验经和训教,如果有错误请指出,万分感谢. 高等Bash脚本编程指南(31):数学盘算命令 成于坚持,败于止步 操作数字 factor ...

  7. 【转】Linux 技巧: Bash 参数和参数扩展

    重点看下清单7 现在,很多 Linux® 和 UNIX® 系统上都有 bash shell,它是 Linux 上常见的默认 shell.通过本文,您将了解到如何在 bash 脚本中处理参数和选项,以及 ...

  8. bash编程总结

    bash应该是目前Linux上最流行的shell脚本解释程序了(还有个shell叫dash,我太讨厌这个东东了.),只要你在linux上工作,并且希望自己能够工作得更愉悦,那么你应该熟悉最基本的bas ...

  9. Shell 函数定义与调用

    linux shell 可以用户定义函数,然后在 shell 脚本中可以随便调用. 以一个计算两数之和的函数为例: #! /bin/bash # 函数定义 sum(){ return $(($1+$2 ...

随机推荐

  1. 蓝桥杯-第39级台阶-java

    /* (程序头部注释开始) * 程序的版权和版本声明部分 * Copyright (c) 2016, 广州科技贸易职业学院信息工程系学生 * All rights reserved. * 文件名称: ...

  2. TypeScript入门-高级类型

    高级类型 交叉类型 交叉类型,就是将多个类型合并为一个新的类型,这个新的类型具有这多个类型的成员,含有这几个类型的所有特性,是他们的综合体,像是集合的并集 例子: function extend< ...

  3. Andriod相机开发关于startPreview Failed的错误的特别记录(重要)

    年前,自己做的Android相机嵌入到一款火爆的游戏中去了,经过几次的修改升级,相机运行上报的错误也越来越少, 但是,前几天刚上线的最新相机,却老是在Android 2.3机器上出现startPrev ...

  4. Layout基本属性总结

    在Android中,共有五种布局方式,分别是:FrameLayout(框架布局),LinearLayout (线性布局),GridLayout(网格布局),RelativeLayout(相对布局),T ...

  5. 【Objective-C 基础】3.类

     1.类 OC中类分为两个文件: .h类的声明文件,用于声明变量.函数. .m类的实现文件,用于实现.h中的函数 类的声明使用关键字@interface @end 类的实现使用关键字@implemen ...

  6. Docker - 访问仓库

    仓库与注册服务器 仓库(Repository)集中存放镜像的项目或目录. 注册服务器(Registry)管理仓库的服务器,服务器上可以有多个仓库,每个仓库有多个镜像. 例如:在仓库地址docker.i ...

  7. Python变量运算字符串等

    一,作用域 操作 name = 'liuyueming' if 1==1:... print name... liuyueming 两次回车执行 修改代码 >>> if 1==1:. ...

  8. 【转】MyISAM和InnoDB 区别

    InnoDB和MyISAM是MySQL最常用的两个表类型,这两个表类型各有优劣,视具体应用而定.基本的差别为:MyISAM类型不支持事务处理等高级处理,而InnoDB类型支持.MyISAM类型的表强调 ...

  9. 【JAVAWEB学习笔记】18_el&jstl&javaee的开发模式

    一.EL技术 1.EL 表达式概述 EL(Express Lanuage)表达式可以嵌入在jsp页面内部,减少jsp脚本的编写,EL 出现的目的是要替代jsp页面中脚本的编写. 2.EL从域中取出数据 ...

  10. LNMP1.3一键安装Linux环境,配置Nginx运行ThinkPHP3.2

    LNMP1.3一键安装Linux环境,配置Nginx运行ThinkPHP3.2 你是否遇见过:安装LNMP1.3环境后,运行ThinkPHP 3.2,只能打开首页,不能访问控制器,报404错误. 按照 ...