Xshell学习第八课:函数

函数:
1、函数介绍function
 为了避免代码重复使用,我们一般通过函数编写代码块,而这一个代码块用来实现某种功能。
 且,这个功能在后面的代码中,会重复调用;
 
 def
2、函数的语法格式
 函数的写法格式:
 function check_cpu {
  cat /proc/cpuinfo
 }
 ls /etc/
 check_cpu 【不调用函数,则函数体中的命令是不会执行的;在哪里调用,函数体中的命令就在那里执行】
 *fun_name() {
  函数体
  $1 $2 ... $10
 }
 fun_name 1 2 3
 :wq
 function.sh 4 5 6 7 8 9 10 11 12 13 14
3、函数的调用  -- return
 函数返回值
 1、当函数中指定了判断语句的时候,我们默认要返回一个错误的结果,但是最近一条命令确实正确的,这时候,我们需要通过return返回一个我们需要的错误状态码;
 2、函数结束的时候,我们需要指定一个return的正确返回码;
 如果使用在循环语句中,return会跳出循环;
4、函数接受参数
 函数 变量
 和普通的命令一样
 只需要注意,在函数接受参数的时候,不会使用外部的传参,而是以脚本内部的参数为准,
 
5、函数中的变量
 本地变量
  local 变量名=xxx
  本地变量只在本函数内部生效
 局部变量
  脚本内部的变量
 环境变量
  在整个Linux系统的bash中生效
 
  TEST() {
   local i=9
   let i++
   echo i
   exit 0
  }
  i=1
  TEST
  echo i
 扩展: 关于脚本执行的问题:
 bash 的方式来执行 -- #!/bin/bash
  bash所执行的脚本中定义的变量,在当前shell的子shell中;
 全路径或者相对路径的方式来执行; -- 须有授权执行权限;
 source 脚本文件 或者 . 脚本文件
  source这种方式来执行脚本的时候,内部变量所定义的值是在当前shell中的;
6、函数递归
 你 站在镜子前,后面又有一面镜子
 n的阶乘
  n! = n(n-1)!
           $[$1*  $[ fac -1]]
  fact(){
   if [ $1 -lt 1 ];then
    echo 1  //一定要写成1
   else
    i=$[$1*$(fact $[$1-1])]  //  n(n-1)
    echo $i
   fi
  }
  (n-1) = (n-1)(n-2)!
  。。。
  2!=2*1!
 fac(){
  $[fac -1 ]
 }
 fac 5

 兔子数列,斐波那契数列
  1 + 1 = 2
  1+ 1 + 1 = 3
  2 + 1 + 2  = 5
  3 +  5 = 8
            =   n
  1 1 2 3 5 8 13 21 34 ... n
  $[$(fab $[$1-1])+$(fab $[$1-2])]
  
  Fn = F(n-1) + F(n-2)
  
 #!/bin/bash
 #
 fab(){
     if [ $1 -eq 1 ];then
         echo 1
     elif [ $1 -eq 2 ];then
         echo 1
     else
         echo $[$(fab $[$1-1])+$(fab $[$1-2])]
     fi
 }
 fab 7

练习
1、脚本可以接受参数:start stop restart status
 case 参数 in
 start)
 stop)
 restart)
 status)
 *)
 【case PAT支持的格式:* 任意内容 start|stop)  a*) (case语句中的PAT是支持文件通配的) 】
2、如果参数非此四者之一,提示使用个时候报错退出;
 *)
  echo "Usage:please input {start|stop|restart|status}"
3、如果是start:则创建 /var/lock/subsys/SCRIPT_NAME,并显示“启动成功”【考虑:如果事先已经启动过一次,该如何处理?】
 start)
  if [ -e /var/lock/subsys/testd_name ];then
   echo "服务已启动" 
  else
   touch /var/lock/subsys/testd_name
   echo "服务启动成功"
  fi
4、如果是stop:则删除/var/lock/subsys/SCRIPT_NAME,并显示“停止完成”;【考虑:如果事先已经停止过了,该如何处理?】
 stop)
  if [ -e /var/lock/subsys/testd_name ];then
   rm -f /var/lock/subsys/testd_name
   echo "服务关闭成功"
  else
   echo "服务已经关闭"
  fi
5、如果restart,则先stop,再start;【考虑:如果本来没有start,如何出列?】
 restart)
  【将前面的代码写成函数】
  start
  stop
6、如果是status,则
如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示“SCRIPT_NAME is running…”
如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示“SCRIPT_NAME is stopped …”
i=file.txt
Start() {
        if [ -e /root/$i ];then
                echo "服务已经启动"
        else
                touch /root/$i
                echo "服务已启动"
        fi
}
Stop() {
        if [ -e /root/$i ];then
                rm -f /root/$i
                echo "服务已关闭"
        fi
}
Status() {
        if [ -e /root/$i ];then
                echo "服务已开启"
        else
                echo "服务已关闭"
        fi 
}
Usage() {
        echo "Usage:{/root/testd.sh start|stop|status|restart}"
}
if [ $# -lt 1 ];then
        Usage
        exit 1
fi

case $1 in
start)
        Start
        ;;
stop)
        Stop
        ;;
restart)
        Stop
        Start
        ;;
status)
        Status
        ;;
*)
        Usage
        ;;
esac
原文地址:https://www.cnblogs.com/huangchuan/p/11378545.html