Shell 函数的基础实践

示例 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 始终是脚本本身的名字,不是函数名

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值