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

Linux shell getopts 学习

[复制链接]

尚未签到

发表于 2018-8-24 10:41:00 | 显示全部楼层 |阅读模式
  获取UNIX类型的选项:
  unix有一个优点就是标准UNIX命令在执行时都具有相同的命令行格式:
  command -options parameters
  如果在执行Shell程序也采用上述格式,Bourne Shell中提供了一条获取和处理命令行选项的语句,即getopts语句。该语句的格式为:
  getopts option_string varname
  其中option_string中包含一个有效的单字符选项。若getopts命令在命令行中发现了连字符,那么它将用连字符后面的字符同 option_string相比较。若有匹配,则把变量varname的值设为该选项。若无匹配,则variable设为?。当getopts发现连字符后面没有字符,会返回一个非零的状态值。Shell程序中可以利用getopts的返回值建立一个循环。
  有时侯选项中还带一个值,getopts命令同样也支持这一功能。这时需要在option_string中选项字母后加一个冒号。当 getopts命令发现冒号后,会从命令行该选项后读取该值。若该值存在,那么将被存在一个特殊的变量OPTARG中。如果该值不存在,getopts命令将在OPTARG中存放一个问号,并且在标准错误输出上显示一条消息。
  optstring  option  字符串,会逐个匹配
  varname     每次匹配成功的选项
  arg             参数列表,没写时它会取命令行参数列表
  $OPTIND     特殊变量,option index,会逐个递增, 初始值为1
  $OPTARG    特殊变量,option argument,不同情况下有不同的值
  细则1:
  当optstring以":"开头时,getopts会区分invalid option错误和miss option argument。 invalid option错误时,varname会被设成?,$OPTARG是出问题的option;miss option argument时,varname会被设成:(在我的fedora系统里测试OPTARG为?),$OPTARG是出问题的option.
  当optstring不以":"开头,invalid option错误和miss option argument错误都会使varname被设成?, $OPTARG是出问题的option(在我的fedora系统里测试OPTARG为空).
  细则2:
  当optstring中的字母跟”:“时,表明该option可接参数,参数(argument)放在$OPTARG中,如果缺参数,且optstring是以”:“开头,则varname的值会是:(在我的fedora系统里测试OPTARG为?),$OPTARG是该option, 否则varname的值是?,$OPTARG是该option.(参照细则1)(在我的fedora系统里测试OPTARG为空)
  #!/bin/bash
  if [[ $# -lt 1 ]];then
  echo "USAGE:`basename $0` [-a] [-b value] [-c]"
  exit 1
  fi
  while getopts :ab:c name
  do
  case $name in
  a)  aflag=1
  echo "a"
  ;;
  b)  bflag=1
  if [[ ${OPTARG:0:1} = "-" ]]; then
  echo "invalid parameter of $OPTARG"
  exit 1
  fi
  bval=$OPTARG
  ;;
  c)  cflag=1
  echo "c"
  ;;
  \?) echo "Invalid option :`basename $0` [-a] [-b value] [-c]"
  exit 1
  ;;
  :) echo "$0:Must supply an argument to -$OPTARG."
  exit 1
  ;;
  esac
  done
  echo $bval
  在getopts分析选项时,如果-b后面不带参数,直接跟-c的话,那么-c将作为-b的参数。
  下面是一个简单例子(脚本为getopt):
  #/bin/bash
  echo $0
  echo $*
  while getopts ":a:bc" opt
  do
  case $opt in
  a )
  echo $OPTARG
  echo $OPTIND;;
  b )
  echo "b $OPTIND";;
  c )
  echo "c $OPTIND";;
  ? )
  echo "error"
  exit 1;;
  esac
  done
  echo $OPTIND
  echo $*
  shift $(($OPTIND - 1))
  echo $*
  echo $0
  运行sh getopt.sh  -a 12 -b -c 34 -m
  输出:
  getopt.sh
  -a 12 -b -c 34
  12
  3
  b 4
  c 5
  5
  -a 12 -b -c 34
  34
  getopt.sh
  可以得出一些结论: 
  1、$0在用sh 或者 ./执行脚本时,指的是脚本名,用source或.执行时,永运是bash,这也反应了sh 或者 ./执行脚本的原理和source的方式是不同的.
  2、$1 (1....n)指的第一个参数到....第n个参数
  3、OPTARG存储相应选项的参数 OPTIND指向的是下一个参数的index
  4、shift 会改变参数的顺序,通过左移去掉某些参数
  5、getopts检测到非法参数就会停止,比如上例中遇到34就会终止,并不会去检测-m了,也就是说只要前一个参数是合法的(包含在option_string中的),就会继续检测下一个参数。
  另外: unset OPTIND  可以解决shell脚本的函数中使用getopts


运维网声明 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-555878-1-1.html 上篇帖子: shell 测试命令 下篇帖子: Linux shell -- knowledge 1
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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