码迷,mamicode.com
首页 > 系统相关 > 详细

shell 中getopts 的应用

时间:2015-08-04 21:14:05      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:

该语句的格式为: getopts一般格式为:

getopts option_string variable


其中option_string中包含一个有效的单字符选项。若getopts命令在命令行中发现了连字符,那么它将用连字符后面的字符同 option_string相比较。若有匹配,则把变量variable的值设为该选项

。若无匹配,则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;

——————————————————————


下面来实际测试:


  [root@server1 mnt]# vim getopt.sh 
  1 #!/bin/bash                                                                
  2 while getopts "a:b:c:def" what; do
  3   case $what in
  4     a)
  5       echo "this is -a the arg is ! $OPTARG"   
  6       ;;
  7     b)
  8       echo "this is -b the arg is ! $OPTARG"   
  9       ;;
 10     c)
 11       echo "this is -c the arg is ! $OPTARG"   
 12       ;;
 13     d)
 14         echo "this is -d the arg is ! $OPTARG"
 15         ;;
 16     \?)
 17       echo "Invalid option: -$OPTARG"   
 18       ;;
 19   esac
 20 done

注意a:b:c:def  我们先验证后面的" : "

a b c后面是有:的

[root@server1 mnt]# ./getopt.sh -a
./getopt.sh: option requires an argument -- a
Invalid option: -

[root@server1 mnt]# ./getopt.sh -c
./getopt.sh: option requires an argument -- c
Invalid option: -

[root@server1 mnt]# ./getopt.sh -c hello
this is -c the arg is ! hello./getopt.sh: option requires an argument -- c
Invalid option: -

[root@server1 mnt]# ./getopt.sh -b ni
this is -b the arg is ! ni

d e f 没冒号

[root@server1 mnt]# ./getopt.sh -d
this is -d the arg is ! 

[root@server1 mnt]# ./getopt.sh -d hello
this is -d the arg is !




共有两个参数 -a 和 后面的hello

可以看出来有冒号他会强制检测后面的参数取指,没有就会报错。如a b c 而 d并没有:号他没有一个值被系统认为必须存放在变量$OPTARG里


现在在来看看最前面加个冒号的剧情

  1 #!/bin/bash                                                                
  2 while getopts ":a:b:c:def" what; do
  3   case $what in
  4     a)
  5       echo "this is -a the arg is ! $OPTARG"   
  6       ;;
  7     b)
  8       echo "this is -b the arg is ! $OPTARG"   
  9       ;;
 10     c)
 11       echo "this is -c the arg is ! $OPTARG"   
 12       ;;
 13     d)
 14         echo "this is -d the arg is ! $OPTARG"
 15         ;;
 16     \?)
 17       echo "Invalid option: -$OPTARG"   
 18       ;;
 19   esac
 20 done


[root@server1 mnt]# ./getopt.sh -a
[root@server1 mnt]# ./getopt.sh -b
[root@server1 mnt]# ./getopt.sh -c
[root@server1 mnt]# ./getopt.sh -d
this is -d the arg is !

[root@server1 mnt]# ./getopt.sh -a hello
this is -a the arg is ! hello
[root@server1 mnt]# ./getopt.sh -b wo
this is -b the arg is ! wo

可以看出系统此时忽略了后面的错误信息-a -b -c 本来都是要加参数值的 要不就会报错,然而头部给个 : 可以忽略所有错误提醒。

还有一个OPTERR变量如果我们将其置为0(默认为1)

getopts会忽略自身的错误只显示系统的错误

注意情况1不加参数值报错有两条

./getopt.sh: option requires an argument -- c
Invalid option: -


此时我们给他加上这一设定

技术分享

[root@server1 mnt]# ./getopt.sh -a
Invalid option: -
[root@server1 mnt]# ./getopt.sh -b
Invalid option: -
[root@server1 mnt]# ./getopt.sh -c
Invalid option: -
[root@server1 mnt]# ./getopt.sh -d
this is -d the arg is !
[root@server1 mnt]# ./getopt.sh -a 123
this is -a the arg is ! 123



shell 中getopts 的应用

标签:

原文地址:http://my.oschina.net/loveleaf/blog/487759

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!