aa0660 发表于 2018-8-22 11:41:53

shell脚本编程学习之路-函数

1.为什么要使用函数
  先回顾一下别名的作用
  

# alias httpd='/etc/init.d/httpd'  
# httpd start
  
正在启动 httpd:   [确定]
  

  函数的作用就是把程序里多次调用相同的代码部分定义成一份然后为这一份代码起一个名字,其他所有的重复调用这部分代码就都只调用这个名字就可以了,当需要修改这部分重复代码时,只需修改函数体内的一份代码即可实现所有调用修改。
  使用函数的优势:
  (1)把相同的程序段定义成函数,可以减少整个程序的代码量。
  (2)增加程序的可读性,易读性。
  (3)可以实现程序功能模块化,不同的程序使用函数模块化。
  注意:linux系统的2000个命令都可以说是shell脚本的函数。

2.Shell函数的语法
  简单语法格式:
  函数名(){
  指令…
  return n
  }
  规范语法格式:
  function 函数名(){
  指令…
  return n
  }
  提示:shell的返回值是exit输出返回值,函数里用return输出返回值

3.Shell函数的执行
  调用函数:
  (1)直接执行函数名即可不用带括号
  注意:
  a.执行函数时,函数后的小括号不需要带
  b.函数定义及函数体必须在要执行的函数名前面定义,shell的执行是
  从上到下按行执行的。
  (2)函数的传参
  函数的传参和脚本的传参类似,只是脚本名换成函数名即可。
  函数名 参数1 参数2
  函数后接的参数说明:
  a.Shell的位置参数($1、$2、$3、$4、$5、$#、$*、$?、$@)都可以是函数的参数。
  b.此时父脚本的参数临时地被函数参数所掩盖或隐藏。
  c.$0比较特殊,它仍然是父脚本的名称。
  d.当函数完成时,原来的命令行脚本的参数即可恢复。
  e.在shell函数里面,return命令功能与shell里exit类似,作用是跳出函数。
  f.return语句会返回一个退出值(返回值)给调用函数的程序。
  g.函数的参数变量是函数体里面定义的,如果是普通变量一般会使用local,比如说定义一个a就用local a 来定义。

4.Shell函数范例
  范例1:开发脚本建立两个简单的函数并调用执行
  

# cat hanshu01.sh  
#/bin/bash
  
nishishei(){
  echo "who are you?"
  
}
  

  
function linzhongniao(){
  echo "I am linzhongniao"
  

  
}
  
nishishei
  
linzhongniao
  

  执行
  

# sh hanshu01.sh  
who are you?
  
I am linzhongniao
  

  如果我们调用的函数在开发的每一个脚本中都要调用可以将函数写到/etc/init.d/functions里面,这里为了方便看清用source执行脚本,也可以用点号“.”。
  

# tail -5 /etc/init.d/functions  
}
  

  
linzhongniao(){
  echo "I am linzhongniao"
  
}
  
# cat hanshu02.sh
  
#/bin/bash
  
source /etc/init.d/functions
  
nishishei(){
  echo "who are you?"
  
}
  
nishishei
  
linzhongniao
  
# sh hanshu02.sh
  
who are you?
  
I am linzhongniao
  

  范例2:函数传参转成脚本传参命令行参数,对任意指定URL判断是否正常。当然也可以判断服务,比如mysql 、httpd等等方法类似这里就不说了,前面分支循环结构有判断服务的例子。
  分步解答:
  a.脚本传参检查web url是否正常
  b.检查的功能写成函数
  c.函数传参转换成脚本命令行传参,对任意指定URL判断是否异常。
  

# cat check_url.sh  
#!/bin/bash
  
[ -f /etc/init.d/functions ]&& . /etc/init.d/functions
  

  
usage(){   #usage给用户一个提示
  echo "USAGE:$0 url"
  exit 1
  
}
  

  
RETVAL=0
  
CheckUrl(){
  wget -T 10 --spider -t 2 $1 &>/dev/null
  jieguo=$?
  if [ $jieguo -eq 0 ];then
  action "$1 url" /bin/true
  else
  action "$1 url" /bin/false
  

  fi
  return $RETVAL
  
}
  
main(){
  if [ $# -ne 1 ];then判断参数输入参数的个数,如果不等于1执行usage函数
  usage
  fi
  CheckUrl $1
  jieguo=$?
  Return $jieguo
  
}
  

  
main $*   # $*这里的作用是不管敲多少个参数都当成一个,防止乱输入别的东西
  

  执行结果:
  

# sh check_url.sh www.baidu.com  
www.baidu.com url[确定]
  
# sh check_url.sh www.sss.com
  
www.sss.com url[失败]
  

  范例3:给字符串加颜色的传参例子
  用过if方式实现 输出颜色要用echo –e转义。
  

# cat color.sh  
#!/bin/bash
  
RED_COLOR='\E[1;31m'
  
GREEN_COLOR='\E[1;32m'
  
YELLOW_COLOR='\E[1;33m'
  
BLUE_COLOR='\E[1;34m'
  
PINK='\E[1;35m'
  
SHAN='\E[31;5m' #提示闪烁,配合echo –e 使用
  
RES='\E[0m'
  
usage(){
  echo -e${SHAN} "USAGE:$0 {red|green|yellow|pink}" contents ${RES}
  exit 1
  
}
  
color(){
  
if [ "$1" = "red" ];then
  echo -e "${RED_COLOR} $2 $RES"
  
elif [ "$1" = "green" ];then
  echo -e "${GREEN_COLOR} $2 $RES"
  
elif [ "$1" = "yellow" ];then
  echo -e "${YELLOW_COLOR} $2 $RES"
  
elif [ "$1" = "blue" ];then
  echo -e "${BLUE_COLOR} $2 $RES"
  
else
  usage
  
fi
  
}
  

  
main(){
  if [ $# -ne 2 ];then
  usage
  fi
  color $1 $2
  
}
  
main $*
  

拓展:

1.直接加颜色
  

# cat color1.sh  
#!/bin/bash
  
echo -e "\033[30m 黑色字 I am linzhongniao \033[0m"
  
echo -e "\033[31m 红色字 I am linzhongniao \033[0m"
  
echo -e "\033[32m 绿色字 I am linzhongniao \033[0m"
  
echo -e "\033[33m ×××字 I am linzhongniao \033[0m"
  
echo -e "\033[34m 蓝色字 I am linzhongniao \033[0m"
  
echo -e "\033[35m 紫色字 I am linzhongniao \033[0m"
  
echo -e "\033[36m 天蓝字 I am linzhongniao \033[0m"
  
echo -e "\033[37m 白色字 I am linzhongniao \033[0m"
  

  执行结果


2.字背景颜色范围40---47
  

# cat beijingcolor.sh  
#!/bin/bash
  
echo -e "\033[40;37m 黑底白字 I am linzhongniao \033[0m"
  
echo -e "\033[41;37m 红底白字 I am linzhongniao \033[0m"
  
echo -e "\033[42;37m 绿底白字 I am linzhongniao \033[0m"
  
echo -e "\033[43;37m 黄底白字 I am linzhongniao \033[0m"
  
echo -e "\033[44;37m 蓝底白字 I am linzhongniao \033[0m"
  
echo -e "\033[45;37m 紫底白字 I am linzhongniao \033[0m"
  
echo -e "\033[46;37m 天蓝白字 I am linzhongniao \033[0m"
  
echo -e "\033[47;30m 白底黑字 I am linzhongniao \033[0m"
  

  执行结果:



页: [1]
查看完整版本: shell脚本编程学习之路-函数