SECTION 20 创建函数

创建函数

函数是一个脚本代码块,可以为其命名并在代码中的任何位置调用。要在脚本中使用函数代码块,只要使用所起的函数名(调用函数)。

创建函数

关键字function,第一种格式:

function name {
commands
}

name属性定义了函数的唯一名称,脚本中每个函数必须有一个唯一的名称
commands是构成函数的一条或多条bash shell命令,调用函数时,bash shell命令会按定义的顺序依次执行

第二种格式:

name() {
commands
}
使用函数

在行中指定函数名即可实现使用

注意:函数调用应该在函数定义之后

返回值

bash shell会把函数当作一个小型脚本,运行结束时会返回一个退出状态码
默认返回值为函数最后一条命令返回的退出状态码,不能使用$?提取函数返回值,会把return前执行命令的状态码返回给$?
使用return命令来退出函数并返回特定的退出状态码,退出状态码必须是0~255,如果不在此区间则会产生错误值

使用函数输出
1.在函数中将要输出的结果使用echo输出,使用命令替换将函数输出赋给变量,例如

db1() {
	echo 4
}
result=`db1`或result=$(db1)

2.可以在函数内定义全局变量,函数主体通过全局变量获取函数输出

在函数中使用变量
向函数传递参数:函数可以使用标准的参数环境变量来表示命令行上传给函数的参数,例如,$0表示函数名,$1表示传给函数的第一个参数等,也可以使用$#判断传递给函数的参数数目

注意:向函数传参,必须将参数和函数置于同一行
函数无法直接使用脚本的参数值,需要在调用函数的时候进行传递,例如:func $1 $2

在函数中处理变量

函数中使用两种类型的变量:全局变量和局部变量

全局变量是在shell脚本中任何地方都有效的变量

1.如果在脚本主体部分定义了一个全局变量,那么可以在函数内读取它的值,同样如果在函数内定义了一个全局变量,在脚本主体部分可以读取它的值
2.默认情况下,在脚本中定义的任何变量都是全局变量

局部变量在函数内,变量声明或赋值前加上local,则定义了局部变量

如果脚本主体和函数内有相同名称的变量,函数内的变量为局部变量,则shell会保持将两个变量的值分离
所以此时可以共享需要共享的变量,而分离需要分离的变量

向函数传数组参数
需要把所有数组元素都传给函数,例如:脚本主体:testit ${myarray[*]},函数体内:local na=$@

从函数返回数组,在函数最后将数组echo,然后调用函数把结果放进变量。另外可以直接使用全局变量

#!/bin/bash

testit() {
local na
na=$@
echo "${na[*]}"
local sum=(2 4 6 8)
echo ${sum[*]}
}

my=(1 2 3 4 5)
testit ${my[*]}
tt=($( testit ))
echo "return:${tt[*]}"

]# ./test.sh 
1 2 3 4 5
2 4 6 8
return:2 4 6 8

函数递归
局部变量的一个特性是自成体系,函数可以调用自己来得到结果,递归函数都有一个最终可以迭代到的基准值(即有可迭代到的停止条件)
阶乘示例:5!=5*4*3*2*1=120

#!/bin/bash

function factorial {
	
	if [ $1 -eq 1 ];then
		echo 1
	else
		local temp=$[ $1 - 1 ]
		local result=$(factorial $temp)
		echo $[ $result * $1]
	fi	
}

read -p "input:	" value
result=$(factorial $value)
echo "$value! is $result"

创建库

1.将常用的函数创建为函数库文件
2.使用source命令调用函数库文件,source命令会在当前shell上下文中执行命令,而不是创建一个新shell。
source,也称作点操作符(dot operator,.)

例如,在func2中调用函数库文件func1,需要在func2中写入
. ./func1(假设在同一目录)

在命令行创建函数
在本shell的命令行中创建函数,后续都可以使用,但需要注意,不要和内建函数重名,函数会覆盖原命令
缺点:退出shell,函数就消失了

在.bashrc中定义函数,有两种方法

1.直接定义在.bashrc中
2.使用source命令将函数库文件读取到.bashrc中

优点:后续脚本不需要调用库文件,直接能使用函数

shtool,GNU shtool shell脚本函数库,内部包含大量各式各样的函数,可以将其用于自己的脚本中

下载:ftp://ftp.gnu.org/gnu/shtool/shtool-2.0.8.tar.gz
解压:tar -zxvf shtool-2.0.8.tar.gz
shtool需要针对特定的linux环境进行配置,必须使用标注的configure和make
配置:./configure
构建:make
安装:make install

shtool库函数:

序号 函数 描述
1 Arx 创建归档文件(包含一些扩展功能)
2 Echo 显示字符串,并提供一些扩展构键
3 fixperm 改变目录树中的文件权限
4 install 安装脚本或文件
5 mdate 显示文件或目录的修改时间
6 mkdir 创建一个或更多目录
7 Mkln 使用相对路径创建链接
8 mkshadow创建一棵阴影树
9 move 带有替换功能的文件移动
10 Path 处理程序路径
11 platform 显示平台标识
12 Prop 显示一个带有动画效果的进度条
13 rotate 转置日志文件
14 Scpp 共享的C预处理器
15 Slo 根据库的类别,分离链接器选项
16 Subst 使用sed的替换操作
17 Table 以表格的形式显示由字段分隔的数据
18 tarball 从文件和目录中创建tar文件
19 version 创建版本信息文件

shtool使用格式

shtool [options] [function [options] [args]]

例如:shtool platform,shtool prop -p "waiting..."

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值