8.19 函数

函数:
1、函数介绍function
  为了避免代码重复使用,我们一般通过函数编写代码块,而这一个代码块用来实现某种功能。
  且,这个功能在后面的代码中会重复使用。
2、函数的语法格式:
  function check_cpu{
  cat /proc/cpuinfo
  }
  ls /etc/
  check_cpu{不调用函数,则函数体中的命令是不会执行的;在哪里调用,函数体中的命令就在哪里执行}

  *fun_name(){
  函数体
  $1$2...$10
  }
  funname 1 2 3
  :wq
  function.sh 4 5 6 7 8 9 10 11 12 13

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)!
  (n-1)=(n-1)(n-2)!

  2!=2*1!
  兔子数列,斐波那契数列

  练习:
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:
  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/liuyuanzzz/p/11379333.html