标签:
该语句的格式为: 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
。
标签:
原文地址:http://my.oschina.net/loveleaf/blog/487759