[Linux Shell学习系列八]Shell函数-3函数的调用

D16

函数的调用方式有多种:

直接在Shell命令行调用函数;

脚本内部调用函数;

从其他函数文件中调用函数;

递归的调用函数。

1. Shell命令行调用函数

$ yday() { date --date='1 day ago'; }
$ yday
Mon May 25 11:36:03 CST 2020

2. 在脚本中调用函数

需要在脚本中创建函数,并确保它位于调用此函数的语句之前。

$ cat yday.sh 
#!/bin/bash
#20200525

yday() { date --date='1 day ago'; } #创建函数

yday #脚本中调用函数

#执行脚本
$ ./yday.sh 
Mon May 25 11:37:35 CST 2020

如果调用前没有创建:

$ cat yday.sh 
#!/bin/bash
#20200525

yday #调用函数之前没有创建

yday() { date --date='1 day ago'; }

#执行脚本
$ ./yday.sh 
./yday.sh: line 4: yday: command not found

3. 从函数文件中调用函数

可以把函数存储在一个函数文件中,可以把函数文件中的函数加载到当前脚本或命令行。

#函数文件
$ cat yday.sh #!/bin/bash #20200525 yday() { date --date='1 day ago'; }
#当前脚本 $
cat current.sh #!/bin/bash #20200526 . /home/ntrade/20200511study/yday.sh #通过.加载函数文件到当前Shell环境 yday #调用函数文件中的函数

#执行当前脚本 $ .
/current.sh Mon May 25 11:45:55 CST 2020

source命令也可以用于加载函数文件到当前Shell脚本或命令行。

1)脚本调用:

#函数文件
$ cat yday.sh 
#!/bin/bash
#20200525

callscript() { local a="$0"; local b="$*"; echo "Current script: $a, args: $b"; }

callscript $*

yday() { date --date='1 day ago'; }

#当前脚本
$ cat current.sh 
#!/bin/bash
#20200526

source /home/ntrade/20200511study/yday.sh test #source命令可以指定参数

yday

#执行当前脚本
$ ./current.sh 
Current script: ./current.sh, args: test #通过source获取到了当前脚本和参数
Mon May 25 12:03:47 CST 2020

2)命令行:

$ yday #不加载函数文件,直接调用函数
-bash: yday: command not found

$ source yday.sh #加载函数文件

$ yday #调用函数
Mon May 25 11:48:24 CST 2020

注文中示例较长,自行编写上述示例。

4. 递归函数调用

需要注意:Shell中递归函数执行速度慢,尽量避免使用。

$ cat fact.sh 
#!/bin/bash
#20200526

factorial(){
        local i=$1
        local f

        #声明变量i和f为整数
        declare -i i 
        declare -i f

        #开始递归调用,直到$f小于等于2
        [ $i -le 2 ] && echo $i || { f=$(( i - 1 )); f=$(factorial $f); f=$(( f * i )); echo $f; }

}

#显示函数用法
[ $# -eq 0 ] && { echo "Usage: $0 number"; exit 1; }

#调用函数
factorial $1        

执行:

$ ./fact.sh 
Usage: ./fact.sh number
$ ./fact.sh  0
0
$ ./fact.sh  1
1
$ ./fact.sh  2
2
$ ./fact.sh  5
120

本节结束

猜你喜欢

转载自www.cnblogs.com/workingdiary/p/12964743.html