Shell函数语法
12/10
本文最后更新于
2023年12月10日,已超过
447天没有更新。如果文章内容或图片资源失效,请留言反馈,我会及时处理,谢谢!
shell函数通过组合命令来实现特定目的及代码复用。
函数定义
函数定义两种写法:
#第一种写法
func_name () {
cmds
}
#第二种写法
function func_name [()] {
cmds
}
不加function
关键字的函数定义可移植性更好。函数必须在使用之前定义,一般在脚本开始出定义或者放在独立的脚本中用点号( . )来source引用它(这有点像其它语言include包含头文件处理)。
函数调用
函数调用方式与执行shell命令相同,需要提供函数名称和对应参数,参数不需要使用括号括起来。
myfunc 10 true
需要注意的是,在函数体内位置参数($1
$2
... $#
$@
$*
)都是该函数的参数。父脚本参数暂时被函数参数掩盖。
但$0
依旧是父脚本的名称。当函数完成时,原来命令行参数会恢复。
#!/bin/bash
myfunc() {
echo 'function arg[0]=' $0
echo 'function arg[1]=' $1
echo 'function arg[2]=' $2
}
echo 'script arg[0]=' $0
echo 'script arg[1]=' $1
echo 'script arg[2]=' $2
type myfunc #使用type命令查看myfunc类型
myfunc func1 func2
执行结果
$./func_arg.sh hi you
script arg[0]= ./func_arg.sh
script arg[1]= hi
script arg[2]= you
myfunc is a function
myfunc ()
{
echo 'function arg[0]=' $0;
echo 'function arg[1]=' $1;
echo 'function arg[2]=' $2
}
function arg[0]= ./func_arg.sh
function arg[1]= func1
function arg[2]= func2
函数退出状态
前面说了shell函数很像命令,命令执行会有exit status
,使用$?
可以查询。同样的函数也有退出状态,很像函数返回值。
shell函数中使用return命令使函数返回调用脚本,不能使用exit命令,这会终止整个shell脚本。
如果return后面不加参数,使用默认退出状态,即最后一个执行的命令的退出状态(0代表成功,非0代表失败)。退出状态可以通过$?
捕获。
return exit-value
指定退出码,函数会像命令一样返回整数的退出状态值,需要注意的是在bash中退出码范围为0-255
,当退出码为256时返回的是0.
#!/bin/bash
#第一种函数返回值:return指定返回值,需要注意不能超过255,且使用$?引用返回值
myfunc() {
local rc=999
return 255
}
#第二种函数返回值:函数中使用echo输出返回值,注意echo不要输出其他信息
myfunc1() {
rc1=999
echo $rc1
return
}
#第三种函数返回值:使用全局shell变量
myfunc2() {
rc2=999
echo $rc2
return 257
}
myfunc
echo 'local rc' $?
rc_out=`myfunc1`
echo 'rcode outside function' $rc_out
myfunc2
echo 'myfunc2 rc' $?
echo 'global variable rc2=' $rc2
执行结果
local rc 255
rcode outside function 999
999
myfunc2 rc 1
global variable rc2= 999
函数局部变量
函数内变量是全局变量,不仅函数可见,脚本其他地方也可见。bash中可用local关键字定义函数局部变量。
#!/bin/bash
func ()
{
local loc_var=23
global_var=999
}
func #调用函数
echo "loc_var=" $loc_var
echo "global_var=" $global_var
执行结果
loc_var=
global_var= 999
注:如果函数func
没有调用,变量global_var就未定义。
小结
当开发一定规模的shell脚本时应该考虑函数组织方式,尽可能的复用共性函数。

