设为首页 收藏本站
查看: 917|回复: 0

shell学习之函数与库(一)

[复制链接]

尚未签到

发表于 2018-8-29 09:03:24 | 显示全部楼层 |阅读模式
  函数堪称shell的精华,有了函数和库,shell处理复杂问题也像编译语言那样有头有脸了,总之,shell的函数和库的重要性不言而喻。
  1   函数的定义
  建议使用
  FUNC_NAME (){}的定义方法
  有些人可能喜欢在前面加上function标记,这是bash独有的
  function FUNC_NAME(){}
  有点是简洁,容易识别是函数
  2  函数返回值
  一般可以用
  ①在函数中,return 返回
  ②调用函数,通过命令引用 比如   a=`func_name   haha`
  3 书上的一个小例子,计算1-6的二次方,三次方
  [root@www shell]# cat square-cube.sh
  #!/bin/bash
  #
  txt="_mktmp"
  square_cube()
  {
  echo "$2 * $2"|bc > $1
  echo "$2 * $2 * $2"|bc >> $1
  }
  for i in `seq 1 5`
  do
  square_cube $txt $i
  square=`head -1 $txt`
  cube=`tail -1 $txt`
  echo "square of $i  is $square"
  echo "cube   of $i  is $cube"
  done
  rm -f $txt
  执行结果:
  [root@www shell]# ./square-cube.sh
  square of 1  is 1
  cube   of 1  is 1
  square of 2  is 4
  cube   of 2  is 8
  square of 3  is 9
  cube   of 3  is 27
  square of 4  is 16
  cube   of 4  is 64
  square of 5  is 25
  cube   of 5  is 125
  总结下:这里是一个很简单的函数调用,函数的功能就是处理办理计算结果保存在特定位置,主脚本负责控制流程
  tips:1和l很相似,大家要注意,害的我浪费了时间
  4  debugger脚本
  [root@www shell]# cat debugger.sh
  #!/bin/bash
  #
  #this a debugger by function
  LOGFILE=/tmp/log.log
  #指定脚本名
  APPNAME=$0
  #指定DEBUG级别,越高就显示越多的冗余信息
  VERBOSE=10
  #logmsg负责显示传递给它的消息
  logmsg()
  {
  echo "$APPNAME:`date`--entered---$@" >> $LOGFILE
  }
  #debug负责显示错误/调试 信息
  debug()
  {
  verbosity=$1
  #shift的目的在于把级别挪走,以便只显示debug信息
  shift
  if [ "$verbosity" -le "$VERBOSE" ] ;then
  echo "$APPNAME:`date`---level:${verbosity}---:$@" >> $LOGFILE
  fi
  }
  #die函数你懂得
  die(){
  echo "$APPNAME:`date`----fatal error--$@"
  exit 1
  }
  #主脚本测试
  #显示脚本开始,好像有点多余哈
  logmsg   now  the log-checking  system start -------
  #测试uname -a命令是否存在
  uname -a||die uname -a command  not find.
  #uname存在的话,继续执行
  logmsg -----------system-info`uname -a`
  #判断是redhat或者debian系统
  cat /etc/redhat-release||debug 8 this is not a redhat system!
  cat /etc/debian-release||debug 8  this is not a debian system!
  #书上更多点,我这里省略了一些,为了简洁
  运行结果
  [root@www shell]# ./debugger.sh
  Linux www.centos.vbird 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

  CentOS>  cat: /etc/debian-release: No such file or directory
  总结下,这里三个函数互相协调使用,有撤销的,有报错的,注意$@指全部参数,$0指文件名,$1指第一个参数,等,这些如果不知道的话得恶补啦
  5 递归函数举例
  典型a:计算阶乘
  [root@www shell]# cat factorial.sh
  #!/bin/bash
  #
  factorial(){
  if [ "$1" -gt "1" ];then
  previous=`expr $1 - 1`
  parent=`factorial $previous`
  result=`expr $1 \* $parent`
  echo $result
  else
  echo 1
  fi
  }
  factorial $1
  执行结果:
  [root@www shell]# sh -x factorial.sh  3
  + factorial 3
  + '[' 3 -gt 1 ']'       ;;判断是否是1
  ++ expr 3 - 1
  + previous=2
  ++ factorial 2   ;;由于parent=`factorial $previous`在函数中调用了该函数,所以是递归
  ++ '[' 2 -gt 1 ']'
  +++ expr 2 - 1
  ++ previous=1
  +++ factorial 1
  +++ '[' 1 -gt 1 ']'
  +++ echo 1
  ++ parent=1     ;;最后知道初始条件为1的阶乘为1
  +++ expr 2 '*' 1
  ++ result=2
  ++ echo 2
  + parent=2
  ++ expr 3 '*' 2
  + result=6
  + echo 6
  6
  可以算大的数,就是慢…


运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-557972-1-1.html 上篇帖子: 对nginx的日志进行分割的shell脚本 下篇帖子: shell脚本获得本机ip地址
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表