逆水行舟用力撑,一篙松劲退千寻。这篇文章主要讲述创建函数-----------(创建函数定义函数使用函数返回值)相关的知识,希望能为你提供帮助。
第6章创建函数6.1 基本脚本函数
编写比较复杂的shell脚本时,完成具体任务的代码可能需要重复使用。bash shell提供满足这种要求的特性。函数是被赋予名称的脚本代码块,可以在代码的任意位置重用。每当需要在脚本中使用这样代码块时,只需引用该代码块被赋予的函数名称。
6.1.1 创建函数
在bash shell脚本中创建函数可以使用两种格式。一种格式是使用关键字function,后跟代码块的函数名:
name属性定义了该函数的唯一名称。脚本中自定义的每个函数都必须赋予唯一的名称。commands是组成函数的一条或多条bash shell命令。当调用函数是,就像在普通脚本一样,bash shell按照各条命令在函数中出现的顺序依次执行。
在bash shell脚本中定义函数另一个格式,更接近一般编程语言定义函数的方式:
函数名之后的空白园括号表明这是在定义函数。该格式的函数命名规则与前面的shell脚本函数格式相同。
6.1.2 使用函数
要在脚本中使用函数,相应函数名需要在脚本行中指定,这与shell命令的用法一样。
#!/bin/bash
#在脚本中创建一个简单的函数并使用函数
function func1
echo "This is an example of a function"
count=1
while [ $count -le 5 ]
do
func1
count=$[ $count + 1 ]
done
echo "This is the end of the loop"
func1
echo "Now this is the end of the script"
函数名func1每次被引用时,bashshell返回func1函数的定义并执行该函数定义的全部名。函数定义不一定位于shell脚本的起始部分,但是应当小心使用。如果在函数定义之前使用函数,会得到错误消息。使用函数前,需要先定义函数。
函数的命令需要注意。每个函数名必须唯一,否则会出问题。如果重新定义函数,那么新定义将取代函数原先的定义,这不会引发错误消息。
6.2 返回值
bashshell将函数看作小型脚本,并以退出状态结束。函数退出的状态有3中生成方式。
6.2.1 默认退出状态
默认情况下,函数的退出状态是函数的最后一条命令返回的退出状态。函数执行完毕之后,可以使用标准变量$?来确定函数的退出状态。操作实例如下所示:
#!/bin/bash
#测试退出函数的状态
function func1
echo "显示一个不存在的文件!"
ls -l badfile
echo "测试函数:"
func1
echo "退出状态:$?"
该函数的退出状态是2,因为最后一条命令执行失败。但无法得知函数的其他命令是否成功执行。
【创建函数-----------(创建函数定义函数使用函数返回值)】
#!/bin/bash
#测试退出函数的状态
function func1
ls -l badfile
echo "显示一个不存在的文件!"
echo "测试函数:"
func1
echo "退出状态:$?"
由于函数结尾是能够完全成功执行的echo语句,虽然有一条命令运行失败,但是函数的退出状态仍然是0。所以,使用函数的默认退出状态是一种危险的做法。
6.2.2 使用return命令
bash shell使用return命令以特定退出函数。return命令可以使用单个整数值来定义函数退出状态,提供一种通过编程设置函数退出状态的简单方法。使用这种方法返回数据时,必须注意避免两个容易发生的错误:
?
在函数完成后尽快提取返回值
?
退出状态的取值范围是0~255
#!/bin/bash
#在函数中使用return命令
function db1
read -p "Enter a value:" value
echo "Doubling the value"
return $[ $value * 2 ]
db1
echo "The new value is $?"
如果在通过使用变量$?提取函数值之前了其他命令,那么该函数的返回值将丢失。如果想要返回更大的整数值或字符串,那么不要使用这种返回值方法。
6.2.3 使用函数输出
函数的输出也可以捕获并存放到shell变量中。这种方法可以从函数获取任意类型的输出并给出变量赋值:result=`db1`。这条命令将函数db1的输出赋予shell变量$resutl。在脚本中使用这种方法实例如下:
#!/bin/bash
#在函数中使用return命令
function db1
read -p "Enter a value:" value
echo $[ $value * 2 ]
result=`db1`
echo "The new value is $result"
这个新函数使用echo语句显示计算结果。该脚本仅捕获函数db1的输出,而不查看结果的退出状态。函数db1实际输出两条消息。read命令输出一条较短的消息向用户询问取值。bash shell脚本比较聪明,不会将此消息作为STDOUT输出的组成部分,而将其忽略。假如使用echo语句生成这条消息,那么shell变量将捕获这条消息,对于输出值也是如此。
PS:这个方法也可以返回浮点数和字符串值,所以这种方法能够非常灵活地从函数返回数据。
推荐阅读
- sedgawk介绍与正则表达式-----------(扩展的正则表达式)
- sedgawk介绍与正则表达式-----------(定义基本正则表达式(BRE)模式)
- 脚本控制------------------------(at命令mail命令batch命令cron表格anacron表格)
- sedgawk介绍与正则表达式-----------(正则表达式定义与类型)
- 脚本控制------------------------(作业控制查看作业jobs命令重新启动停止的作业)
- sedgawk介绍与正则表达式-----------(sed编辑器基础知识)
- 脚本控制------------------------(nice与renice命令进程优先级控制)
- sedgawk介绍与正则表达式-----------(sed编辑器简单使用)
- 脚本控制------------------------(以后台模式运行脚本nohup)