示例 1:函数的定义与调用(顺序问题)
#正确示例(fun1.sh):先定义函数,再调用 [root@controller bin 11:17:31]# vim fun1.sh [root@controller bin 11:17:58]# cat fun1.sh #!/bin/bash function hello () { echo "Hello World !" } hello # 调用 hello 函数(必须在定义之后调用) [root@controller bin 11:17:54]# bash fun1.sh Hello World ! #错误示例(fun2.sh):调用在定义之前 [root@controller bin 11:18:07]# vim fun2.sh [root@controller bin 11:19:06]# cat fun2.sh #!/bin/bash hello # 这里先调用函数,但此时函数还未定义 function hello () { echo "Hello World !" } #错误原因是 函数调用放在了函数定义之前,导致 Shell 执行时找不到 hello 函数 [root@controller bin 11:19:09]# bash fun2.sh fun2.sh:行2: hello: 未找到命令
示例 2:调用外部文件中的函数(函数复用)
#步骤 1:创建存放函数的外部文件(mylib) [root@controller bin 11:20:00]# cat >> mylib << 'EOF' > function hello () { > echo "Hello World !" > } > EOF #步骤 2:在脚本中调用外部函数(fun3.sh) [root@controller bin 11:21:49]# vim fun3.sh [root@controller bin 11:22:18]# cat fun3.sh #!/bin/bash if [ -r mylib ];then # 检查 mylib 文件是否存在且可读(-r 表示可读) source mylib # 加载外部文件(相当于把 mylib 中的内容复制到这里执行) else echo mylib is not exist exit 1 fi hello # 调用从 mylib 中加载的 hello 函数 [root@controller bin 11:22:23]# bash fun3.sh Hello World ! # 执行结果:成功加载外部函数并调用
注释:source 文件名
用于加载外部脚本 / 函数,方便复用函数(不用重复定义)
示例 3:带参数的函数(根据输入做不同操作)
[root@controller bin 11:22:39]# vim fun4.sh [root@controller bin 11:23:19]# cat fun4.sh #!/bin/bash #定义 print 函数,根据传入的参数输出不同颜色的文字 function print () { # 判断第一个参数($1 是函数的第一个参数)是否为 PASS if [ "$1" == "PASS" ];then # 输出绿色的 PASS echo -e '\033[1;32mPASS\033[0;39m' elif [ "$1" == "FAIL" ];then # 红色高亮输出 FAIL echo -e '\033[1;31mFAIL\033[0;39m' elif [ "$1" == "DONE" ];then # 紫色高亮输出 DONE echo -e '\033[1;35mDONE\033[0;39m' else # 如果参数不符合,提示正确用法 echo "Usage: print PASS|FAIL|DONE" fi } # 提示用户输入内容,并保存到变量 str 中 read -p "请输入你想要打印的内容:" str print $str # 调用 print 函数,传入用户输入的参数 [root@controller bin 11:23:23]# bash fun4.sh 请输入你想要打印的内容:aaa Usage: print PASS|FAIL|DONE [root@controller bin 11:23:46]# bash fun4.sh 请输入你想要打印的内容:PASS PASS
注释:函数内部用 $1
、$2
接收参数,和脚本的参数用法类似,用于实现灵活的功能
示例 4:函数参数与脚本参数的区别
[root@controller bin 11:23:57]# vim fun5.sh [root@controller bin 11:24:36]# cat fun5.sh #!/bin/bash # 定义 print 函数(功能同示例3) function print () { if [ "$1" == "PASS" ];then echo -e '\033[1;32mPASS\033[0;39m' elif [ "$1" == "FAIL" ];then echo -e '\033[1;31mFAIL\033[0;39m' elif [ "$1" == "DONE" ];then echo -e '\033[1;35mDONE\033[0;39m' else # $0 在这里指的是脚本名(fun5.sh),而非函数名 echo "Usage: $0 PASS|FAIL|DONE" fi } str=$2 # 脚本的第二个参数($2 是脚本的参数,不是函数的) print $str # 调用函数,传入脚本的第二个参数 # 测试:执行脚本时传入两个参数 PASS 和 FAIL [root@controller bin 11:24:39]# bash fun5.sh PASS FAIL FAIL # 结果:函数收到的是脚本的第二个参数(FAIL),第一个参数(PASS)未被使用 # 测试:不传入参数,触发错误提示 [root@controller bin 11:25:04]# bash fun5.sh Usage: fun5.sh PASS|FAIL|DONE # $0 显示的是脚本名 fun5.sh,而非函数名
注释:
-
脚本的参数(
$1
、$2
)和函数的参数(函数内的$1
、$2
)是独立的,函数不会自动接收脚本的参数,需要手动传递 -
函数内部的
$0
始终是脚本本身的名字,不是函数名