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

getopts 处理shell脚本参数

[复制链接]

尚未签到

发表于 2018-8-19 11:09:44 | 显示全部楼层 |阅读模式

  •   intruduction
      shell 脚本有二种方法定位脚本参数,一种是使用位置变量,二是使用getopts。使用位置参数有两个限制,他需要编程者自己测试错误并建立相应的消息。若使用shift处理参数,shift命令会删除掉所有的参数,如果你想在以后再次访问他们,将是不可能的。
      getopts是built-in 命令,它可以方便地将命令行位置参数解析为选项并验证选项是否有效。
  •   getopts optstring name [args]
      getopts引用的三个环境变量
      OPTARG: 上一个由getopts内置命令处理的选项参数的值, option argument(存放选项参数),当选项需要选项参数时,getopts 命令就将其置于变量 OPTARG 中
      OPTIND:  下一个由getopts内置命令处理的参数的序号,option index,每次调用脚本它都会被初始值为1,会逐次递增。
      OPTERR: 如果设为1,bash会显示getopts的错误。设为0,不显示getopts的错误。
      getopts 的处理过程
      调用脚本时,OPTIND为初始化为1。每调用一次getopts,就将下一个选项值赋给name , 选项索引值OPTIND也会指向下一个要处理选项的位置,选项参数则会赋给OPTARG
      getopts 的设计目标是在循环中运行,每执行一次,getopts就检查下一个命令行参数,并判断它是否有效。(即检查参数是否以-开头,后面跟一个包含在opstring中的字母)。
      有效,则把匹配的选项字母存在指定的变量variable中,并返回退出状态0(ture);
      无效(如果-后面的字母没有包含在options),就在 variable 中存入一个?,并返回退出状态0;如果命令行中已经没有参数,或者下一个参数不以-开头,就返回不为0的退出状态(false, 可用于结束while 循环)。
      getopts处理完所有参数后,会返回一个非0值(false,退出循环),此时OPTIND索引值指向第一个非选项的参数[args],name置为?
      getopts 错误处理
      正确使用命令时,name用来存储option, $OPTARG用来存放option的参数。若命令输入有误(选项无效,缺少参数),getopts会处理illegal option错误和miss option argument错误。处理结果与opstring是否以:开头而不同。opstring 开头的:用于屏蔽getopts处理时的错误消息(脚本中将OPTERR置于0也可以达到同样的效果)。
      使用下面的测试用例getopts.sh可以快速验证getopts如何处理错误
      opstring 分别取值":ab:c:"和"ab:c:"
      ./getopts.sh -a -b ok -c no
      ./getopts.sh -a -b
      ./getopts.sh -w
      脚本中通常使用? 捕获错误,name,OPTARG对待错误的取值可以用于自行定义错误消息的输出。
    示例opstring错误类型nameOPTARG./getopts.sh-a -b":ab:c:"missoption argument:b./getopts.sh-w":ab:c:"illegal options?w./getopts.sh-a -b"ab:c:"missoption argument?unsetOPTARG./getopts.sh-w"ab:c:"illegal options?unset OPTARG(取消变量)
  •   特殊说明
      : ? 的特殊用途,故不作为选项字符来使用
      getopts 允许把选项堆叠在一起(如 -ms)
      opstring 包含一个可以放在一起选项字符串,若选项后带:,代表该选项调用里需要参数,调用这样的选项是不能与其它选项堆叠。
      同一shell 环境多次执行getopts ,OPTIND不会被重置,重新调用参数时,必要时需手动重置OPTIND。
      getopts 找到定义或未定义的选项时,都会返回0(true); 如果处理完参数,或者遇到错误,则返回非0值(false)
  •   eg
  cat getopts.sh
  #!/bin/bash
  #===============================================================================
  #
  #          FILE:  getopts.sh
  #
  #         USAGE:  ./getops.sh
  #
  #   DESCRIPTION_:
  #
  #       OPTIONS:  ---
  #  REQUIREMENTS:  ---
  #          BUGS:  ---
  #         NOTES:  ---
  #        AUTHOR:  Adelphos (), adelphos@msn.cn
  #       COMPANY:
  #       VERSION:  1.0
  #       CREATED:  11/06/2014 04:15:10 AM EST
  #      REVISION:  ---
  #===============================================================================
  while getopts "ab:c:" opt
  do
  case ${opt} in
  a)        echo -e  " \r
  opt:\t         $opt
  OPTIND: \t $OPTIND \r
  OPTARG:        \t$OPTARG \r
  OPTERR: \t $OPTERR"        ;;
  b)        echo -e  " \r
  opt:\t         $opt
  OPTIND: \t $OPTIND \r
  OPTARG:        \t$OPTARG \r
  OPTERR: \t $OPTERR"        ;;
  c)        echo -e  " \r
  opt:\t         $opt
  OPTIND: \t $OPTIND \r
  OPTARG:        \t$OPTARG \r
  OPTERR: \t $OPTERR"        ;;
  ?)  echo "usage:"
  echo -e"\t -a specify the installation path"
  echo -e"\t -b specify the product type which you want to install, possible choiceis ESE,CONSV,CLENT"
  echo -e "\t -c specify the installpackage"
  echo-e  " \r
  opt:\t         $opt
  OPTIND: \t $OPTIND \r
  OPTARG:        \t$OPTARG \r
  OPTERR: \t $OPTERR"        ;;
  esac
  done


运维网声明 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.iyunv.com/thread-553797-1-1.html 上篇帖子: login no-login shell 的执行顺序 下篇帖子: 20.16/20.17 shell中的函数20.18 shell中的数组20.19 告警系统需求分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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