《云计算》shell高级编程-shell函数第一篇(共两篇)

函数的定义

接下来两篇我们开始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

  • name = 函数名
  • foo = 参数1 ——传递给函数的第一个 参数
  • bar = 参数2——传递给函数 的第二个参数

比如下面这个栗子:

#!/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命令定义为局部变量。

  • local 命令将全局变量变为局部变量
  • declare 命令的效果同上,也将变量定义为全局变量
  • declare -g 选项定义变量时,变量为全局变量
  • 总结,在一个函数内,直接定义一个变量,或者用declare -g 定义一个变量,都是将变量定义为全局变量。
当前的函数名 FUNCNAME

工作中,遇到脚本很长,包含很多函数,函数可以相互调用,有时候在调试脚本时,脚本运行到那个函数了,不清楚怎么办,利用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")'

从上面的执行结果可以清楚的看出脚本执行的函数调用

  • FUNCNAME是一个数组
  • ${FUNCNAME[0]}代表当前执行的函数的名字
  • ${FUNCTION[1]}代表调用上面那个函数的函数的名字
  • 以此类推
下一篇,函数的执行,清除,返回命令return ,递归函数

你可能感兴趣的:(《云计算》shell高级编程-shell函数第一篇(共两篇))