linux下的getopts

一、getopts 命令

 

 1、用途

     处理命令行参数,并校验有效选项。

  2、语法

     getopts 选项字符串 名称 [ 参数 ...]

  3、描述

   getopts 命令是 Korn/POSIX shell 的内置命令,用来从参数列表检索选项以及选项参数。选项由一个+(加号)或者是由一个-(减号)后跟一个字符开始。一个既不是以+,也不是以-开始的选项结束选项字符串。每次调用 getopts 命令时,它将下一个选项的值放置在名称内,并将下一个要处理的参数的索引置于 shell 变量 OPTIND 中。一旦调用了shell , OPTIND 将初始化为1。当选项以 +开头,则+ 将预先设为名称中的值。

    *如果选项字符串中的字符后面带有“:”(冒号),则预期此选项将带有参数。当选项需要选项参数时,getopts 命令就将其置于变量 OPTARG 中。

        当查找到选项字符串所不包含的选项字符,或者查找到的选项没有所需的选项参数时:

  • 如果选项字符串不以:(冒号)开头,名称 将会被设置为 ?(问号)字符,OPTARG. 将被取消设置,并且诊断消息将被写入到标准错误中。

   这种情况被认为是在将参数传递给所调用的应用程序的过程中所检测到的错误,而不是在处理 getopts 命令的过程中所发生的错误;如上所述,写入诊断消息,但退出状态将变为零。

  • 如果选项字符串以 :(冒号)开头,名称 将被设为 ? (问号)字符,这是对未知的选项来说的,或者为缺少的所需选项设为:(冒号)字符,OPTARG 将被设置为已查找到的选项字符,并且 标准错误中将不写入任何输出。

以下任何字符都可以识别选项结尾:特殊选项- -,查找到不以-,或者+为开头的参数,或者遇到错误。

        当遇到选项结尾时:

  • getopts 命令将退出运行,并且返回值大于零,OPTARG 将被设置为第一个非选项参数索引,在这种情况下,如果第一个 - - 参数之前未出现其它非选项参数,将认为它是选项参数,或者如果没有非选项参数,设置为值 $#+1,名称将被设置为? (问号)字符,
 4、参数

   选项字符串
包含 getopts 命令识别的选项字符串。如果字符后带有冒号,则预期选项将带有参数,应该以单独参数的形式提供此参数。可以用空格将选项与参数分隔开。如果选项字符是未知的或者选项参数丢失,则选项字符串中的第一个字符将决定 getopts 命令的行为。

注意:应用程序不应该将问号和冒号字符作为选项字符。使用其它非字母数字的字符会产生不明的结果。

名称
由 getopts 命令对查找到的选项字符设置。

参数 ...
一个或多个被空格分隔的字符串,由 getopts 命令校验是否是合法选项。如果省略参数 ,就使用位置参数。有关位置参数的更多信息,请参见 Korn Shell 中的 参数替换。

注意: 一般来说,不必将参数指定为 getopts 命令的一部分,但在进行脚本调试时可能会有所帮助。

  5、退出状态

   此命令返回下列出口值:

        0
查找到由选项字符串指定的或未指定的选项。

       <0
遇到选项结束或发生错误。

 

二、在shell下使用getopts命令:

  1. 下列 getopts 命令规定 a、b 和 c 为有效选项,并且选项 a 和 c 带有参数:

     

    getopts a:bc: OPT
    
  2. 下列 getopts 命令指定 a、b 以及 c 为有效选项, 并且选项 a 和 b 带有参数,而且 getopts 在命令行遇到为定义的选项时,它将 OPT 的值设置为 ?:

     

    getopts :a:b:c OPT
    
  3. 下列脚本分析和显示其参数:

     

    aflag= 
    bflag=   
    while getopts ab: name 
      do             
         case $name in             
            a)     aflag=1;;            
            b)     bflag=1                          
                   bval="$OPTARG";;             
            ?)     printf"Usage: %s: [-a] [-b value] args\n" $0                           
                   exit 2;;          
         esac 
      done  
     if [ ! -z "$aflag" ]; then            
            printf "Option -a specified\ n" 
     fi  
     if [ ! -z "$bflag" ]; then          
            printf'Option -b "%s" specified\ n' "$bval" 
     fi  
     shift $(($OPTIND -1)) 
     printf "Remaining arguments are: %s\n" "$*"
    
  4、在Bash里有以下用途:

    (1). optstring  option 字符串,会逐个匹配
                 (2). varname    每次匹配成功的选项
                 (3). arg        参数列表,没写时它会取命令行参数列表
                 (4). $OPTIND    特殊变量,option index,会逐个递增
                 (5). $OPTARG    特殊变量,option argument,不同情况下有不同的值

         细则1:

     当optstring以”:“开头时,getopts会区分invalid option错误和miss option argument错误。
           invalid option时,varname会被设成?,$OPTARG是出问题的option;
            miss option argument时,varname会被设成:,$OPTARG是出问题的option。
         细则2:

     如果optstring不以”:“开头,invalid option错误和miss option argument错误都会使
          varname被设成?,$OPTARG是出问题的option。
细则3:

                    当optstring中的字母跟”:“时,表明该option可接参数,参数(argument)放在$OPTARG中;
                    如果缺参数,且optstring是以”:“开头,则varname的值会是:,$OPTARG是该option,
                   否则varname的值是?,$OPTARG是该option。(参照细则1)

    5、例子:gg.sh

[root@localhost shel]# cat gg.sh
#gg.sh
#!/bin/bash
while getopts  "abc:def:ghi" flag
do
  echo "$flag" $OPTIND $OPTARG         # 这里$OPTIND 是一个索引序列号,$OPTARG 是选项里所记录的值,无值是为空,默认情况下选项是以空格分隔
done
echo "Resetting"
OPTIND=1    while getopts  "abc:def:ghi" flag
do
  echo "$flag" $OPTIND $OPTARG
done

[root@localhost shel]# ./gg.sh -ab -c foo -f "foo bar" -h -gde
a 1  
b 2
c 4 foo
f 6 foo bar
h 7
g 7
d 7
e 8
Resetting
a 1
b 2
c 4 foo
f 6 foo bar
h 7
g 7
d 7
e 8

上面是显示结果。

如果调整一下所给参数的位置:

[root@localhost shel]# ./gg.sh -abc foo -f "foo bar" -h –gde  a 1
b 1
c 3 foo
f 5 foo bar
h 6
g 6
d 6
e 7
Resetting
a 1
b 1
c 3 foo
f 5 foo bar
h 6
g 6
d 6
e 7

你可能感兴趣的:(getopts)