Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5285485
  • 博文数量: 1144
  • 博客积分: 11974
  • 博客等级: 上将
  • 技术积分: 12312
  • 用 户 组: 普通用户
  • 注册时间: 2005-04-13 20:06
文章存档

2017年(2)

2016年(14)

2015年(10)

2014年(28)

2013年(23)

2012年(29)

2011年(53)

2010年(86)

2009年(83)

2008年(43)

2007年(153)

2006年(575)

2005年(45)

分类: LINUX

2007-08-30 17:59:17

获取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
阅读(6240) | 评论(3) | 转发(0) |
给主人留下些什么吧!~~

wangdan16002009-11-13 11:17:38

2应该是:将参数指针左移到$OPTIND-1的位置,也就是命令行的第一个参数的位置处。

wangdan16002009-11-13 11:16:07

1. man getopts: When the end of options is encountered, getopts exits with a return value greater than zero. OPTIND is set to the index of the first non-option argument, and name is set to ?. 2. 作用是将OPTIND的值减一。 3. 大括号的作用防止shell做扩展,比如:如果FILE有空格,那么cp file1 file 2命令就有问题。加了大括号,cp file1 "file 2"就没问题了。 PS: cp并不支持第三个参数 ${COPY},而且对同一个文件向同一个地方拷贝多次也没意义。

qingkong94162008-03-22 16:49:53

看了你的文章收益匪浅,小弟我接触linux不久,还是一个菜鸟,关于第二个脚本有几个问题想请教你,还望不吝赐教! 1、if [ $OPTIND -gt $# ]   then     echo "No file name specified"      exit 2   fi 这个if比较为什么要用大于呢? 2、shift 'expr $OPTIND - 1' 这条语句的作用是什么呢? 3、cp $FILE $ {FILE} $ {COPY} 为什么要用大括号把FILE何COPY给扩上呢?