【Linux】SHELL 函数

函数的定义与调用

SHELL函数本质是一个SHELL代码块,通过唯一命名,可以在脚本中的任意位置调用定义的代码块,避免重复代码以及代码维护。函数的定义有两种方式,第一种以function关键字标识定义函数:

function function_name{
	commands
}

function_name必须是唯一的,若不唯一,同名后定义的函数会覆盖之前定义的同名函数,commands是一组shell命令,调用函数的时候,本质是执行这组命令。第二种定义方式以括号来标识:

function_name(){
	commands
}

在脚本中调用函数,就像使用其他shell命令一样,在需要的地方指定函数名字就可以调用了。注意调用函数必须在定义函数之后,否则会报错,因为shell脚本是按顺序执行的,若调用之前,shell没有发现其定义,则会报"command not found"。
 

定义函数的返回值

函数可以认为是一个小型脚本,当函数运行完后,会返回一个退出状态码,默认情况下,函数的返回状态码取函数定义中最后一个命令的退出状态码,可以通过return命令、命令替换的方式自定义函数的返回值。
 

return命令

return命令会终止正在运行的函数并返回指定的值,语法格式为return n,n需要为整数数值,参数n将作为函数的退出状态码值,若需要返回字符串或浮点数等其他类型,需使用其他方式。由于return语句具有停止函数的功能,一般是放在函数体的最后一句。
 

命令替换

由于return命令的返回类型受限,可以在定义commands中,最后指定一个echo用于打印函数的输出,然后用$(function_name)的方式获取函数的输出。
 

向函数传递参数

由于函数本质是一个小型脚本,因此可以像脚本执行时那样,在函数调用时,向函数传递参数。调用函数时向函数传递参数的语法为function_name arg1 arg2 ....传递的参数必须与调用的函数放置在同一行上。函数会使用特殊的参数环境变量来记录传递给函数的参数值,如$0记录函数名,$1, $2…记录传递的第一个、第二个…参数,$#记录参数环境变量的数量,比如以下定义了一个加法函数:

function add{
	if [ $# -eq 2 ]; then
		return $[ $1 + $2 ]
	else
		return 1
	fi	
}

add 10 20  # 调用函数,参数与函数需放置在同一行
echo $?  # 查看函数的返回值

由于在函数定义中使用了参数环境变量,但主体脚本中也存在参数环境变量$#,$1 等,所以在函数中的参数环境变量与主体脚本中的参数环境变量代表不同的含义,不能在函数体中直接使用主体脚本的参数环境变量,如果需要使用主体脚本中参数环境变量的值,需要在函数调用时,向函数传递主脚本的参数环境变量值。可以参考下面例子:

function add{
	if [ $# -eq 2 ]; then
		return $[ $1 + $2 ]
	else
		return 1
	fi	
}

add $1 $2  # 此处的参数环境变量是主体脚本中的参数环境变量
echo $?  # 查看函数的返回值

函数中使用变量

根据变量的作用域(变量的作用域是指变量的可见范围)划分, 函数中使用的变量包含两种类型:全局变量与局部变量。默认情况下,在脚本中、包含函数定义中的变量类型都是全局变量,全局变量是指在脚本中的任意地方都是可见的,局部变量是指仅在函数体内是可见的,当需要在函数体内定义局部变量时,需使用local命令声明变量类型,有两种声明方式local variable 或者 local variabel=expression
 

调用函数库文件

在脚本中定义函数,避免了重复代码;但如果需要在多个不同的脚本中使用同一段代码,则需要使用函数库文件,然后使不同的脚本调用函数库文件。使用函数库文件的第一步是创建库文件,可以将定义好的函数放在一个普通的shell脚本中,然后就定义好了。
 

第二步就可以在需要使用的脚本中调用库文件,需注意与shell环境一样,shell函数的作用域仅在其定义的shell会话中有效, 如果在脚本中直接执行库文件,则会在执行脚本的过程中,新开启一个shell并在新shell中定义函数,但是脚本中运行的那个shell中是调用不到新shell中定义的函数滴。可以在脚本中使用source命令来执行库函数来解决作用域的问题, 使用suorce命令在脚本中执行函数库文件后,定义的函数就是在脚本主体存在的shell中,因此脚本中的后续命令都可以直接调用函数库中的函数。
 

参考资料

《Linux命令行与shell脚本编程大全•第3版》

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值