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
本节结束