Who am I

我的照片
Hefei, Anhui, China
Research Fields: Satellite Geodesy

2012年2月8日星期三

getopts语句


getopts语句的语法:
getopts option-string variable
其中option_string中包含一个有效的单字符选项。若getopts命令在命令行中发现了连字符,那么它将用连字符后面的字符同option_string相比较。若有匹配,则把变量variable的值设为该选项。若无匹配,则variable设为?。当getopts发现连字符后面没有字符,会返回一个非零的状态值。Shell程序中可以利用getopts的返回值建立一个循环。
getopts对命令行给出的选项进行分析,过程如下:
ü  getopts检查所有命令行参数,找到以”-”字符开头的字符;
ü  当找到以”-”字符开头的参数后,将跟在”-”字符后的字符与在option-string中给出的字符进行比较;
ü  若找到匹配,指定的变量variable被设置成选项,否则,variable被设置成”?”字符;
ü  重复上面三项,直到考虑完所有的选项;
ü  当分析结束后,getopts返回非零值并退出。

下面代码说明了date命令中怎么使用getopts命令处理各种选项,该程序除了完成unix的标准命令date的功能外,还增加了许多新的选项。
#newdate
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';;
      H)date '+%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
$ newdate -J
  94031
$ newdate -a -h -d
  Mon
  Jan
  31
$ newdate -ahd
  Mon
  Jan
  31 

有时侯选项中还带一个值,getopts命令同样也支持这一功能。这时需要在 option_string中选项字母后加一个冒号
getopts命令发现冒号后,会从命令行该选项后读取该值。若该值存在,那么将被存在一个特殊的变量OPTARG中。额外参数和参数之间用空格隔开如果该值不存在,getopts命令将在OPTARG中存放一个问号,并且在标准错误输出上显示一条消息。
下面的例子,实现拷贝一个文件,并给文件赋一个新的名字。-c选项指定程序拷贝的次数,-v选项要求显示新创建文件的文件名。
# Syntax: duplicate [-c integer] [-v] filename 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 
   输出结果为:
$ duplicate -v fileA
 fileA1
 $ duplicate -c 3 -v fileB
 fileB1
 fileB2
 fileB3 

没有评论:

发表评论