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

关于shell脚本基础编程第四篇

[复制链接]

尚未签到

发表于 2018-8-27 10:59:10 | 显示全部楼层 |阅读模式
  shell脚本基础编程第四篇
  本章主要内容:函数
  函数
  function:
  function 名称 { 命令 ; } 或 name () { 命令 ; }
  定义 shell 函数。
  创建一个以 NAME 为名的 shell 函数。当作为一个简单的命令启用时,
  NAME 函数执行调用 shell 的上下文中的 COMMANDs 命令。当 NAME
  被启用时,参数作为 $1...$n 被传递给函数,函数的名字储存在变量
  $FUNCNAME 中。
  函数function是由若干条shell命令组成的语句块,实现代码重用和模块化编程
  与shell程序形式上是相似的,不同的是他不是一个单的进程,
  不能独立运行,而是shell程序的 一 部分。
  函数由两部分组成:函数名和函数体
  语法:
  function f_name {
  ...函数体..
  }
  语法:
  f_name() {
  ...函数体...
  }
  函数的定义和使用:
  可在交互式环境下定义函数
  可将函数放在脚本文件中作为它的一部分
  可放在只包含函数的单独文件中
  调用:函数只有被调用才会执行
  调用:给定的函数名
  函数名出现的地方,会被自动替换为函数代码
  函数的生命周期:被调用时创建返回时终止
  函数返回值:
  函数的执行结果返回值:
  使用echo或printf命令进行输出
  函数体中调用命令的输出结果
  函数的退出状态码:
  默认取决与函数中执行的最后一条命令的退出状态码
  自定义退出状态码:
  return            从函数中返回,用最后状态命令决定返回值
  return 0         没有错误返回
  return 1-255 有错误返回
  ==========================================================================
  命令行举例,交互式环境下举例
  [root@Compro ~]# function fun1(){ echo "xiaomag";}  在一行里面要加上;分号
  [root@Compro ~]# fun1
  xiaomag
  定义函数名称为fun1,函数体为输出xiaomag;    然后直接输入fun1函数名,输出的内容为xiaomag
  ==========================================================================
  shell脚本间简单举例
  [root@Compro ~]# vim fun2.sh
  #!/bin/bash
  #
  #user:Compro
  #简单定义函数名称,函数体可以是命令,下面看下几个简单的命令
  fun2(){                                                 这个算是在脚本中嵌入了函数
  who
  pwd                                              函数一般在文件的前面;调用文件的前面;
  ifconfig                                         如果把下面的echo放在最前面,会导致不能调用这个函数;
  ls
  hostname                                     执行后会显示这几条命令的结果返回值
  echo "执行函数fun2结果"          当所有函数执行结束后,显示打新输入一句话;也可以说是返回值
  }
  echo "执行函数fun2开始"                  在这个函数体执行的开始输出显示
  fun2
  echo "执行函数fun2结束"                  执行上面结果结束后最后显示
  函数在使用前必须定义,因此应该将函数定义放在脚本的开始 ,
  直到shel首次发现函数体后才能使用;调用函数体仅使用定义好的函数名就可以。
  注意:在脚本里面定义的函数,不能在命令行下单独使用,因为不在一个shell进程,两边不想干
  ==========================================================================
  set可以产看显示定义的变量。以及函数;
  该定义的函数将一直保留到用户从系统退出,或执行了 unset fun1  取消函数定义
  函数优先级:
  别名
  函数
  内部
  外部
  使用函数文件:
  可以将经常使用的函数存入函数文件,然后将函数文件载入shell中。
  文件名可任意的选取,但是最好与相关任务有某种联系。
  例如:functions.main
  ==========================================================================[root@Compro ~]# vim funs      创建函数文件
  #/bin/bash
  fun3(){                                           函数名
  echo "xiaomag"                  函数体
  }
  funn4(){                                        函数名
  edho "xiaomage"               函数体
  }                                                    可以定义多个函数
  ==========================================================================
  当函数文件定义好以后,需要加载到当前shell才能使用,就可以在命令行或脚本中调用函数,
  可以使用set命令查看并检查所有定义的函数,
  其输出列表包括已经载入shell的所有函数。
  加载函数文件到当前shell:.  filename 或者 source filename
  注意:.点 空格  文件名  这里的文件名要带正确路径
  执行shell函数:
  [root@Compro ~]# fun3
  xiaomag
  [root@Compro ~]# fun4
  xiaomage
  ==========================================================================
  若是要改动函数,首先用unset命令从shell中删除函数,改动完毕后,才重新载入此文件。
  现在对函数做一些改动。首先删除函数,使其对shell不可用。使用unset命令完成此功能
  命令格式为:unset 函数名称
  [root@Compro ~]# unset fun4   这样shell中 set就没有个这函数了
  ==========================================================================
  在shell脚本中调用函数文件中的函数
  [root@Compro ~]# vim testfuns.sh    脚本
  #/bin/bash
  source funs        在脚本里面调用funs函数文件中的函数;如果函数文件要是跟这个脚本不在一个路径下,要写清楚路径
  fun3               函数名
  fun4               函数名
  ==========================================================================
  函数参数:
  传递参数给函数:调用函数时,在函数名后面以空白分隔给定参数列表即可;
  例如 fun1 变量1 变量2 ...
  在函数体当中可使用$1 $2 ... 调用这些参数;还可以使用$@,$*,$# 等特殊变量
  函数变量:
  环境变量:当前shell和子shell有效
  本地变量:只在当前shell进程有效,为执行脚本会启动专用子shell进程,
  因此,本地变量的作用范围是当前shell脚本程序文件,包括脚本中的函数
  局部变量:函数的生命周期;函数结束时变量自动销毁
  注意:如果函数中有局部变量,如果其名称同本地变量,使用局部变量。
  在函数中定义局部变量的方法:
  local 变量名=变量值    函数内部有效。不加local是本地变量,加上是局部变量
  函数递归:
  函数直接或间接调用自身
  注意递归层数
  举例
  fun (){echo fun;fun;}                               死循环,直到一定的程度会退出当前shell终端
  fun () { let i++;echo $i;fun;}                   递增i循环。直到当前系统资源耗尽退出当前shell终端
  10!=10*9!=10*9*8!=10*9*8*7!=...
  n!=1*2*3....*n
  (n-1)!=1*2*3....*(n-1)*n=n!
  fun(
  echo fun n-1 * n
  )
  ==========================================================================
  vim fact.sh
  #/bin/bash
  #
  #user:Compro
  fact(){    阶乘函数
  if [ $1 -eq 0 -o $1 -eq 1 ];then调用 $1等于0    0的阶乘等于1   或者 $1等1  1的阶乘是1
  echo 1如过给的数值是0或者是1就打印1
  else如果给的不是0也不是0
  echo "$[ $1*` fact $[$1-1]`]"$1*调用函数自己$1-1的值 它们的阶乘
  fi
  }
  fact $1通过调用函数的值$1
  ==========================================================================
  执行结果
  [root@Compro ~]# bash fact.sh 1
  1
  [root@Compro ~]# bash fact.sh 2
  2
  [root@Compro ~]# bash fact.sh 3
  6
  [root@Compro ~]# bash fact.sh 4
  24
  [root@Compro ~]# bash -x fact.sh 4
  + fact 4
  + '[' 4 -eq 0 -o 4 -eq 1 ']'
  ++ fact 3
  ++ '[' 3 -eq 0 -o 3 -eq 1 ']'
  +++ fact 2
  +++ '[' 2 -eq 0 -o 2 -eq 1 ']'
  ++++ fact 1
  ++++ '[' 1 -eq 0 -o 1 -eq 1 ']'
  ++++ echo 1
  +++ echo 2
  ++ echo 6
  + echo 24
  24
  ·


运维网声明 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-557226-1-1.html 上篇帖子: shell 脚本-sed工具 下篇帖子: shell的特殊文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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