shell getopts

getopts配合case来进行操作时有两个隐含变量:一个是OPTARG,用来取当前选项的值,另外一个是OPTIND,代表当前选项在参数列表中的位移。OPTIND是一个特殊的变量,它的初始值是1,每次getopts处理完一个命令参数后就递增它,得到getopts要处理的下一个参数。

   下面的例子可参考:

>cat test4
#!/bin/bash
while getopts "ab:cd:" Option
# b and d take arguments
#
do
case $Option in
a) echo -e "a = $OPTIND";;
b) echo -e "b = $OPTIND $OPTARG";;
c) echo -e "c = $OPTIND";;
d) echo -e "d = $OPTIND $OPTARG";;
esac
done
shift $(($OPTIND - 1))

>sh test4 -a -b foo -cd bar
a = 2
b = 4 foo
c = 4
d = 6 bar

>sh test4 -ab foo
a = 1
b = 3 foo

>sh test4 -a -c
a = 2
c = 3

 

getopts (Shell内置命令)
处理命令行参数是一个相似而又复杂的事情,为此,C提供了getopt/getopt_long等函数,C++的boost提供了Options库,在shell中,处理此事的是getopts和getopt.

先说一下getopts/getopt的区别吧,getopt是个外部binary文件,而getopts是shell builtin。

[admin@intlqa142055x ~]$ type getopt
getopt is /usr/bin/getopt
[admin@intlqa142055x ~]$ type getopts
getopts is a shell builtin
getopts不能直接处理长的选项(如:--prefix=/home等)
关于getopts的使用方法,可以man bash  搜索getopts
getopts 有两个参数,第一个参数是一个字符串,包括字符和“:”,每一个字符都是一个有效的选项,如果字符后面带有“:”,表示这个字符有自己的参数。 getopts从命令中获取这些参数,并且删去了“-”,并将其赋值在第二个参数中,如果带有自己参数,这个参数赋值在“OPTARG”中。 提供getopts的shell内置了OPTARG这个变变,getopts修改了这个变量。
这里变量$OPTARG存储相应选项的参数,而$OPTIND总是存储原始$*中下一个要处理的元素位置。
while getopts ":a:bc" opt  #第一个冒号表示忽略错误;字符后面的冒号表示该选项必须有自己的参数
代码实例(getopts.sh):
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
shift $(($OPTIND - 1))
#通过shift $(($OPTIND - 1))的处理,$*中就只保留了除去选项内容的参数,可以在其后进行正常的shell编程处理了。
echo $0
echo $*
执行命令:./getopts.sh -a 11 -b -c
-a 11 -b -c
11
3
b 4
c 5
5
./getopts.sh

 


获取UNIX类型的选项:
  unix有一个优点就是标准UNIX命令在执行时都具有相同的命令行格式:
  command -options parameters
  如果在执行Shell程序也采用上述格式,Bourne Shell中提供了一条获取和处理命令行选项的语句,即getopts语句。该语句的格式为:
  getopts option_string variable
  其中option_string中包含一个有效的单字符选项。若getopts命令在命令行中发现了连字符,那么它将用连字符后面的字符同option_string相比较。若有匹配,则把变量variable的值设为该选项。若无匹配,则variable设为?。当getopts发现连字符后面没有字符,会返回一个非零的状态值。Shell程序中可以利用getopts的返回值建立一个循环。
  下面代码说明了date命令中怎么使用getopts命令处理各种选项,该程序除了完成unix的标准命令date的功能外,还增加了许多新的选项。 
  #新date程序 
  if [ $# -lt 1 ] 
  then 
    date 
  else 
    while getopts mdyDHMSTJjwahr OPTION 
    do 
      case $OPTION 
      in 
        m)date '+%m';; 
        d)date '+%d';; 
        y)date '+%y';; 
        D)date '+%D';; 
        H0date '+%H';; 
        M)date '+%M';; 
        S)date '+%S';; 
        T)date '+%T';; 
        j)date '+%j';; 
        J)date '+%y%j';; 
        w)date '+%w';; 
        a)date '+%a';; 
        h)date '+%h';; 
        r)date '+%r';; 
        /?)echo "无效的选项!$OPTION";; 
      esac 
    done 
  fi
有时侯选项中还带一个值,getopts命令同样也支持这一功能。这时需要在option_string中选项字母后加一个冒号。当getopts命令发现冒号后,会从命令行该选项后读取该值。若该值存在,那么将被存在一个特殊的变量OPTARG中。如果该值不存在,getopts命令将在OPTARG中存放一个问号,并且在标准错误输出上显示一条消息。
  下面的例子,实现拷贝一个文件,并给文件赋一个新的名字。-c选项指定程序拷贝的次数,-v选项要求显示新创建文件的文件名。
  #--拷贝程序
  COPIES=1 
  VERBOSE=N 
  while getopts vc:OPTION 
  do 
    case $OPTION 
    in 
      c)COPIES=$OPTARG;; 
      v)VERBOSE=Y;; 
      /?)echo "无效参数!" 
        exit 1;; 
    esac 
  done 
  if [ $OPTIND -gt $# ] 
  then 
    echo "No file name specified" 
     exit 2 
  fi 
  shift 'expr $OPTIND - 1' 
  FILE=$1 
  COPY=0 
  while [ $COPIES -gt $COPY ] 
  do 
    COPY='expr $COPY + 1' 
    cp $FILE $ {FILE} $ {COPY} 
    if [ VERBOSE = Y } 
    then 
      echo ${FILE} $ {COPY} 
    fi 
  done
另外一个例子:
#!/bin/bash
while getopts "ab:cd:" Option
# b and d take arguments
#
do
case $Option in
a) echo -e "a = $OPTIND";;
b) echo -e "b = $OPTIND $OPTARG";;
c) echo -e "c = $OPTIND";;
d) echo -e "d = $OPTIND $OPTARG";;
esac
done
shift $(($OPTIND - 1))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值