shell 脚本编程学习(六) 函数
来源:互联网 发布:淘宝商家虚假发货 编辑:程序博客网 时间:2024/05/16 11:15
函数
和大多数编程语言一样,shell 脚本也支持函数。在 shell 可以用下面的方式定义和使用函数:
#!/bin/bash# 定义函数sayHello () { echo "hello $1" }# 调用函数并传递参数sayHello jack
上面的例子将输出“hello jack”。shell 中虽然也有函数的概念,但和 c、php、js 等编程语言中函数不太一样,shell 脚本中的函数更像是注入在主 shell 脚本中的一段子脚本,调用函数就像是运行这段子脚本,但它不是在新的进程中运行,所以可以和主 shell 脚本共享变量和函数。函数也可以像 shell 脚本那样通过 $0、$1 等变量获取参数。还要注意 shell 函数的调用一定要在函数定义之后,解释器是顺序解析的,在函数定义之前调用函数将报错。
另外,就像 shell 脚本通过 exit code 返回状态码那样,函数也可以通过 return code 的方式返回一个状态码。但要注意状态码不是文本数据,无法输出,想要返回文本数据可以在函数中 echo 文本数据,再通过反引号或 $() 的方式解析,例如:
#!/bin/bash# 函数返回状态码getCode() { return 0}code=`getCode`echo $code# 输出为空# 函数返回文本值getData () { echo "some text" }data=`getData`echo "data is $data"# 输出为 data is some text
最后 shell 函数也支持嵌套和递归调用,让我们可以实现一些复杂的算法逻辑,当然这样会比较吃资源。
#!/bin/bash# shell 递归实现斐波那契数列fibo () { # 获取参数,即想输出数列的第几个值 index=$1 # index 为 1 或 2 时值为 1 # 用 -lt 选项进行数字小于比较,具体请参考 test 命令帮助 if [ $index -lt 3 ]; then echo 1 else # index 大于等于 3 时数列值为前两项的和 # 注意 shell 中变量都为字符串类型,要借助 expr 命令进行数字计算 n1=`expr $index - 1` n2=`expr $index - 2` expr `fibo n2` + `fibo n1` fi}# 调用函数求斐波那契数列第 10 项的值 fibo 10
作用域
谈到函数当然逃不开作用域。在 shell 脚本中默认所有的变量都在全局作用域下,也就是全局变量。想要只在函数中有效的局部变量可以用 local 来声明。
#!/bin/bash# 变量作用域func () { # 变量 val1 默认在全局作用域下 val1=123 # 用 local 声明变量 val2 为局部变量 local val2=456 echo "val1 in func is $val1" echo "val2 in func is $val2"}funcecho "val1 outsite is $val1"echo "val2 outsite is $val2"# 运行结果# val1 in func is 123# val2 in func is 456# val1 outside is 123# val2 outside is
使用 getopts
getopts 是 shell 内建的一个命令,它可以用来检查和获取传递给命令的选项和参数。它的用法如下
#!/bin/bash# getopts 获取选项和参数# 脚本 getopts.sh# getopts 的语法为 getopts opstring name# opstring 中可以指定脚本接受哪些选项,如果选项必须提供参数就在后面加冒号# 例如下面的 'xy:z:' 表示脚本接受 -x -y -z 选项且 -y -z 选项必须提供参数# name 是一个 shell 变量用来保存选项# getopts 还通过 $OPTIND 保存参数的索引,$OPTARG 保存参数的值while getopts 'xy:z:' name; do echo "$name" $OPTIND $OPTARGdone# shell./getopts.sh -xy "one" -z "two"# 运行结果# x 1# y 3 one# z 5 two
由于函数也可以看作是一段脚本,所以 getopts 命令也可以用在函数中来判断和获取函数接受的选项和参数。
函数库
如果我们有一些通用的函数或处理在很多地方都用的上,那么最好将他们做成库文件供其他脚本调用。类似 php 的 include,shell 脚本想要包含其他脚本或者说是库文件也很简单,用 . 操作符就行了,点后面跟脚本文件名就可以运行指定的脚本,它们不是另起进程而是在同一进程下运行,所以可以共享变量和函数定义,这样就实现了函数库的效果。
例如下面的代码将脚本 lib.sh 包含到当前脚本中,注意 . 操作符后面要有一个空格。另外也可以通过 source 来包含库文件,与 . 操作符效果相同。
#!/bin/bash# 将指定的脚本文件包含到当前脚本. /root/lib/lib.sh# 用 source 命令可以达到相同的目的 source /root/lib/lib.sh # 包含之后就可以使用 lib.sh 中定义的变量和函数了
- shell 脚本编程学习(六) 函数
- Linux-Shell脚本编程-学习-8-函数
- 【Shell】【学习笔记】Linux Shell脚本应用(六)
- Linux脚本(shell)编程(六) 循环
- shell脚本编程学习笔记(1)
- Linux学习(八):shell脚本编程
- shell 脚本编程学习(一) 基础
- shell 脚本编程学习(四) 实例
- linux学习(六) shell脚本(3)
- 详细介绍Linux shell脚本基础学习(六)
- Shell脚本基础学习(六)----双圆括号&双方括号
- shell编程(六)
- Shell脚本编程之函数
- shell 脚本编程之函数
- Linux学习-高级shell脚本编程(一)函数的妙用
- 【Linux 系统编程】shell 脚本基础学习之函数(五)
- Shell脚本编程学习笔记
- Shell脚本编程学习笔记
- BackgroundWorker线程控件用法
- androidstudio 卡顿编译慢的解决方法总结
- 鼠标移动到物体上,利用label和box来显示提示框的区别
- C#重载运算符必须静态吗? 为什么必须是静态的?
- JS数组
- shell 脚本编程学习(六) 函数
- Android反编译apk,修改资源,打包,签名全过程
- 史上最简单的SpringCloud教程 | 第四篇:断路器(Hystrix)
- CentOS7安装JDK1.8
- Baidu Api demo
- Spring Boot + Mybatis + Redis二级缓存(Java Web现代化开发)
- boost::locale::conv:: 字符编码转换
- 文档。关于XMLHttpRequest和js 的问题整理
- if __name__ == "__main__":