接下来两篇我们开始shell函数之旅,
来看一下语法格式:
#函数名
function_name ()
{
#函数体,在函数中执行的命令行
commands...
#参数返回,return语句是可选的。如果没有return语句,则以函数最后 一条命令的运行结果作为返回值;如果使用return语句,则return后跟数值n(0-255)
[ return int ; ]
}
当然,你要是愿意,可以在函数名前面加上关键字function,这看你个人喜好加不加。
也可以在一行内定义一个函数,此时,函数体内的各命令之间必须用分号;隔开,语法如下:
function name { command; command2; commandN; }
向函数传递参数:
name () {
arg1=$1
arg2=$2
command on $arg1
}
函数有自己的命令行参数,使用位置参数来访问传递给它的参数
使用这种方式进行调用函数:
name foo bar
比如下面这个栗子:
#!/bin/bash
#====================================
#
# FIREL:passed.sh
# AUTHOR:Xie_qi_chao
# CREATED:20/03/2019
#
#====================================
passed () {
a=$1
echo "passed(): \$0 is $0"
echo "passed(): \$1 is $1"
echo "passed(): \$a is $a"
echo "passed(): total args passed to me $#"
echo "passed(): all args (\$@) passed to me -\"$@\""
}
echo "**** calling passed() first time ****"
passed one
echo "**** calling passed() second time ****"
passed one two three
来看一下执行结果:
[root@xieqc ~]# sh passed.sh
**** calling passed() first time ****
passed(): $0 is passed.sh
passed(): $1 is one
passed(): $a is one
passed(): total args passed to me 1
passed(): all args ($@) passed to me -"one"
**** calling passed() second time ****
passed(): $0 is passed.sh
passed(): $1 is one
passed(): $a is one
passed(): total args passed to me 3
passed(): all args ($@) passed to me -"one two three"
#!/bin/bash
#AUTHOR:Xie_qi_chao
#TIME:20/03/2019
d=/tmp/diskusage.log
create_logfile () {
local d=$1
echo "create_logfile():d is set to $d"
}
d=/tmp/diskusage.log
echo "Before calling create_logfile d is set $d"
create_logfile "/home/haha/diskusage.log"
echo "after calling create_logfile d is set to $d"
看一下输出结果:
[root@xieqc shell]# sh localfvar.sh
Before calling create_logfile d is set /tmp/diskusage.log
create_logfile():d is set to /home/haha/diskusage.log
after calling create_logfile d is set to /tmp/diskusage.log
从上面的栗子可以看出来,local命令定义的变量只在脚本内部有效,是为局部变量,可以结合上面一个脚本综合对比。
局部变量只在只在函数内部生效,全局变量整个脚本都会生效,主要区别在于,是否用local命令定义为局部变量。
工作中,遇到脚本很长,包含很多函数,函数可以相互调用,有时候在调试脚本时,脚本运行到那个函数了,不清楚怎么办,利用FUNCNAME,就可以知道脚本调用 的函数“轨迹”
来看一个调用函数调用函数,显示函数轨迹的栗子:
#!/bin/bash
function fun_1
{
echo "Now ,function name is $FUNCNAME"
declare -p FUNCNAME
}
function fun_2
{
echo "Now,function name is $FUNCNAME"
declare -p FUNCNAME
fun_1
}
fun_2
看一下执行的结果:
[root@xieqc shell]# sh fun_FUNCNAME.sh
Now,function name is fun_2
declare -a FUNCNAME='([0]="fun_2" [1]="main")'
Now ,function name is fun_1
declare -a FUNCNAME='([0]="fun_1" [1]="fun_2" [2]="main")'
从上面的执行结果可以清楚的看出脚本执行的函数调用