shell编程(五)之函数

function:函数

函数只有被调用才会执行
如何调用:给定函数名
  函数名出现的地方,会被自动替换为函数代码

函数的生命周期:被调用时创建,返回时终止
return命令返回自定义状态结果
  0:成功
  1-255:失败

语法一:  

function f_name {
  ...函数体...
}

 语法二:

f_name(){
  ...函数体...
}

练习: 写一个脚本,完成如下要求
1.脚本可接受参数:start,stop,restart,status
2.如果参数非此四者之一,提示使用格式后报错退出
3.如果是start,则创建/var/lock/subsys/SCRIPT_NAME,并显示启动成功
考虑: 如果事先已经启动过一次,该如何处理
4.如果是stop,则删除/var/lock/subsys/SCRIPT_NAME,并显示停止完成
考虑: 如果事先已然停止过了,该如何处理
5 如果是restart,则先stop,在start
考虑:如果本来没有start,如何处理
6.如果是status,则:
如果/var/lock/subsys/SCRIPT_NAME文件存在,则显示”SCRIPT_NAME is running“
如果/var/lock/subsys/SCRIPT_NAME文件不存在,则显示”SCRIPT_NAME is stopped“

#!/bin/bash
proc=$(basename $0)
file=/var/lock/subsys/$proc

function start {
  if [ -e $file ]; then
    echo "$proc服务已启动。。。"
  else
    touch $file
    if [ $? -eq 0 ]; then
      echo "$proc服务启动成功"
    else
      echo "$proc服务启动失败"
    fi
  fi

}
function stop {
  if [ -e $file ]; then
    rm -rf $file
    if [ $? -eq 0 ]; then
      echo "$proc服务停止成功"
    else
      echo "$proc服务停止失败"
    fi
  else
    echo "$proc服务已停止"
  fi
}
function restart {   if [ -e $file ]; then     stop     start   else     start   fi }
function status {   if [ -e $file ]; then     echo "$proc is running"   else     echo "$proc is stopped"   fi }
while true; do   case $option in     start)       start       ;;     stop)       stop       ;;     restart)       restart       ;;     status)       status       ;;   esac read -p "Enter an option(start or stop or restart or status):" option if [[ $option != "start" && $option != "stop" && $option != "status" && $option != "restart" ]]; then   read -p "wrong option,Enter an option again:" option fi done

test18.sh 脚本加入服务:

cp test18.sh /etc/rc.d/init.d
chkconfig --add test18.sh
chkconfig --list test18.sh
chkconfig --level 2345 testsrv on

练习: 添加10个用户

#!/bin/bash
# 添加是个用户,函数实现
function adduser {
  if [ $# -lt 1 ]; then
    return 2 # 2: no arguments
  fi

  if id $1 &> /dev/null; then
    echo "$1 exists."
    return 1
  else
    useradd $1
    [ $? -eq 0 ] && echo "add $1 success" && return 0
  fi
}

for i in $(seq 1 1 10);do
  adduser myuser$i
done

函数递归:函数直接或间接调用自身

1.阶乘:

#!/bin/bash
fact() {
  if [ $1 -eq 0 -o $1 -eq 1 ]; then
    echo 1
  else
    echo $[$1*$(fact $[$1-1])] 
  fi
}
fact 5

2.斐波那契

#!/bin/bash
fab (){
  if [ $1 -eq 1 -o $1 -eq 2 ]; then
    echo 1
  else
    echo $[$(fab $[$1-1])+$(fab $[$1-2])]
  fi
}
fab 10
原文地址:https://www.cnblogs.com/ckh2014/p/10765191.html