1、函数介绍

函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程。

它与shell程序形式上是相似的,不同的是它不是一个单独的进程,不能独立运行,而是shell程序的一部分。

使用时, 在shell 中  source  /path fo function_file,函数将保留至用户退出,也可以使用 unset function_name ,撤销函数

函数和shell程序比较相似,区别在于:

Shell程序在子Shell中运行

而Shell函数在当前Shell中运行。因此在当前Shell中,函数可以对shell中变量进行修改

2、函数返回值

函数有两种返回值:

函数的执行结果返回值:

(1) 使用echo或printf命令进行输出

(2) 函数体中调用命令的输出结果

函数的退出状态码:

(1) 默认取决于函数中执行的最后一条命令的退出状态码

(2) 自定义退出状态码, 其格式为:

return 从函数中返回,用最后状态命令决定返回值

return 0 无错误返回。

return 1-255 有错误返回

3、在脚本中定义、使用函数

函数定义:

函数在使用前必须定义,因此应将函数定义放在脚本开始部分,

直至shell首次发现它后才能使用

调用函数仅使用其函数名即可。

示例:

$cat func1

#!/bin/bash

# func1

hello()

{

echo "Hello there today's date is `date +%F`"

}

echo "now going to the function hello"

hello

echo "back from the function

使用函数:

可以将经常使用的函数存入函数文件,然后将函数文件载入shell。

文件名可任意选取,但最好与相关任务有某种联系。例如: functions.main

一旦函数文件载入shell,就可以在命令行或脚本中调用函数。

可以使用set命令查看所有定义的函数,其输出列表包括已经载入shell的所有函数。

若要改动函数,首先用unset命令从shell中删除函数。改动完毕后,再重新载入此文件

创建函数文件:

函数文件示例:

$cat functions.main

#!/bin/bash

#functions.main

findit()

{

if [ $# -lt 1 ] ; then

echo "Usage:findit file"

return 1

fi

find / -name $1 –print

}

载入函数:

函数文件已创建好后,要将它载入shell

定位函数文件并载入shell的格式:

. filename 或 source filename

注意:此即<点> <空格> <文件名>

这里的文件名要带正确路径

示例:上例中的函数,可使用如下命令:

$ . functions.main

执行函数:

要执行函数,简单地键入函数名即可:

示例:

$findit groups

/usr/bin/groups

/usr/local/backups/groups.bak

删除函数:

现在对函数做一些改动。首先删除函数,使其对shell不可用。使用unset命令完成此功能.

命令格式为:

unset function_name

实例:

$unset findit

再键入set命令,函数将不再显示

函数参数:

函数可以接受参数:

传递参数给函数:调用函数时,在函数名后面以空白分隔

给定参数列表即可;例如“ testfunc arg1 arg2 …”

在函数体中当中,可使用$1, $2, …调用这些参数;还

可以使用$@, $*, $#等特殊变量

4、函数变量

变量作用域:

环境变量:当前shell和子shell有效

本地变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程;因此,本地变量的作用范围是当前shell脚本

程序文件,包括脚本中的函数。

局部变量:函数的生命周期;函数结束时变量被自动销毁

注意:如果函数中有局部变量,如果其名称同本地变量, 使用局部变量。

在函数中定义局部变量的方法

local NAME=VALUE

为了避免函数中变量与shell中已经定义的变量或者命令名字冲突,尽可能使用局部变量

5、函数递归

函数递归:

函数直接或间接调用自身

(注意递归层数)

递归实例:

阶乘是基斯顿·卡曼于 1808 年发明的运算符号,是数学术语一个正整数的阶乘( factorial)是

所有小于及等于该数的正整数的积,并且有0的阶乘为1。自然数n的阶乘写作n!。

n!=1×2×3×…×n。

阶乘亦可以递归方式定义: 0!=1, n!=(n-1)!×n。

n!=n(n-1)(n-2)…1

n(n-1)! = n(n-1)(n-2)

示例: fact.sh

#!/bin/bash

#

fact() {

if [ $1 -eq 0 -o $1 -eq 1 ]; then

echo 1

else

echo $[$1*$(fact $[$1-1])]

fi

}

fact 5

转载于:https://blog.51cto.com/195175108/1854979

shell 函数定义及应用相关推荐

  1. matlab调用sh函数,Shell 函数定义与调用

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

  2. shell函数定义、函数调用及函数返回值用法

    1.函数定义 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.Shell 函数定义的语法格式如下: [function] funname [()]{     函数体    ...

  3. shell 函数定义和调用

    为什么80%的码农都做不了架构师?>>>    一. 函数定义 语法: [function] functionname[()]{action;[return int;] } 说明: ...

  4. Shell函数详解(函数定义、函数调用)

    Shell 函数的本质是一段可以重复使用的脚本代码,这段代码被提前编写好了,放在了指定的位置,使用时直接调取即可. Shell 中的函数和C++.Java.Python.C# 等其它编程语言中的函数类 ...

  5. shell函数(用法及定义)

    shell函数 将命令序列按格式写在一起 可方便重复使用命令序列 文章目录 shell函数 一.shell函数定义: 方法一 方法二 二.函数返回值: 以乘法2乘以某数为例 三.函数传参: 加法 四. ...

  6. Shell函数(函数定义、函数变量、函数调用、函数传参、函数返回值、获取函数返回值)

    分享知识 传递快乐 1.函数定义 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用.Shell 函数定义的语法格式如下: [function] funname [()]{函 ...

  7. 【拔刀吧少年】之shell函数

    函数 一.shell函数定义 二.格式 三.函数返回值 四.函数传参 五.函数变量的作用范围 六.递归 1.阶乘 2.递归查目录 七.创建函数库 总结 一.shell函数定义 将命令序列按格式写在一起 ...

  8. Shell函数知识点大全

    文章目录 一.Shell 函数 二.Shell 函数定义 三.函数返回值 四.函数传参 五.函数变量的作用范围 六.递归 1.阶乘 2.递归目录 七.函数库 一.Shell 函数 1.将命令序列按格式 ...

  9. linux shell 函数库,bash shell 函数库

    bash shell 函数库ash由自由软件基金会,Inc.版权所有(C) 1989-2011. 语法 bash [options] [file] 描述 Bash是一种与sh兼容的命令语言解释器,它执 ...

  10. shell 函数 与 函数库

    目录 前言 一.shell 函数 1.1 Shell函数定义 1.2 函数返回值 1.3 函数参数传值 1.4 函数变量生命周期 1.5 函数中可以调用函数 二.函数之递归 2.1 阶乘 2.2 遍历 ...

最新文章

  1. 重构机房收费系统你要用的——异常处理和抛出异常(try catch finally)——(vb.net)...
  2. 【深度学习】新人如何入门Pytorch的路线?有哪些资源推荐?
  3. flask框架(四):通过局域网访问网站
  4. 大华摄像头解码 ffmpeg_解码矩阵配套液晶拼接屏系统解决安防行业设备过于复杂的问题...
  5. STC学习:便携式温度采集器
  6. 快应用广告开发、各大手机平台测试id、错误码汇总
  7. python列表常见的5种去重方法
  8. 【果壳笔记】生物信息学——陈小伟老师部分
  9. 推销自己的最佳媒介之一就是博客
  10. 微信小程序自定义组件(1)----地址选择器
  11. [强烈推荐]ring0下文件解锁强制删除工具
  12. 请说一下你是如何理解互联网思维的?
  13. codelite解决中文乱码问题
  14. 中外大都市人口密度的数据比较
  15. EduSoho网校系统产品更新:PPT动画转码
  16. 协作通信-af df的matlab仿真,协作通信-AF与DF的MATLAB仿真.pdf
  17. 分享实录 | 阿里巴巴代码缺陷检测探索与实践
  18. 数据结构与算法——算法基础
  19. Word中利用字体把文字转换为特殊图案(转)
  20. [极客大挑战 2019]PHP1

热门文章

  1. AC日记——幸运号码 51nod 1043
  2. 4.3.8 使用模板
  3. 下标随着页面链接的跳转
  4. 在Ubuntu上安装JDK、Ant、Jmeter和Jenkins
  5. hibernate could not resolve property
  6. Applet与NoClassDefFoundError那不为人知的故事[转]
  7. 使用canvas上传图片+上传进度
  8. WPF太阳、地球、月球运动轨迹模拟
  9. [Sdoi2013] 直径
  10. 小程序或者APP 自行使用TOKEN 实现登录会话保持