linux getopts学习笔记

来源:互联网 发布:知乎收藏的文章在哪里 编辑:程序博客网 时间:2024/06/06 04:21

http://www.linuxeden.com/html/develop/20100630/103593.html

       获取UNIX类型的选项:

  unix有一个优点就是标准UNIX命令在执行时都具有相同的命令行格式:

  command -options parameters

  如果在执行Shell程序也采用上述格式,Bourne Shell中提供了一条获取和处理命令行选项的语句,即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;

  miss option argument时,varname会被设成:,$OPTARG是出问题的option。

  如果optstring不以”:“开头,invalid option错误和miss option argument错误都会使

  varname被设成?,$OPTARG是出问题的option。

  细则2:当optstring中的字母跟”:“时,表明该option可接参数,参数(argument)放在$OPTARG中;

  如果缺参数,且optstring是以”:“开头,则varname的值会是:,$OPTARG是该option,

  否则varname的值是?,$OPTARG是该option。(参照细则1)

  ---------------

  $ # 传递到脚本的参数个数

  $ * 以一个单字符串显示所有向脚本传递的参数。与位置变量不同,此选项参数可超过9个

  $ $ 脚本运行的当前进程I D号

  $ ! 后台运行的最后一个进程的进程I D号

  $ @ 与$ #相同,但是使用时加引号,并在引号中返回每个参数

  $ - 显示s h e l l使用的当前选项,与s e t命令功能相同

  $ ? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。

  ------------

  shift 用于重新分配位置参数,其实就是把向参数左移动一个位置如:$1<--$2,$2<--$3老的$1将被删 除掉。

  ------------

  范例:

  [root@localhost ~]# cat getopts2

  #!/bin/sh

  while getopts :ab: name

  do

  case $name in

  a)  aflag=1

  ;;

  b)  bflag=1

  bval=$OPTARG

  ;;

  \?) echo "USAGE:`basename $0` [-a] [-b value]"

  exit  1

  ;;

  esac

  done

  if [ ! -z $aflag ] ; then

  echo   "option -a specified"

  echo  "$aflag"

  echo "$OPTIND"

  fi

  if [ ! -z $bflag ] ; then

  echo   "option -b specified"

  echo  "$bflag"

  echo  "$bval"

  echo  "$OPTIND"

  fi

  echo "here  $OPTIND"

  shift $(($OPTIND -1))

  echo "$OPTIND"

  echo " `shift $(($OPTIND -1))`  "

 

 

http://www.chinaitpower.com/2005September/2005-09-13/204604.html

getopts option_string variable   
具体使用方法请参考getopts的在线文档(man getopts).

使用getopts命令读取unix格式选项
    UNIX格式选项指如下格式的命令行参数:
    command -options parameters
 
    使用格式:
    getopts option_string variable
 
    具体使用方法请参考getopts的在线文档(man getopts).
 
    示例如下:
 
         #newdate
         if [ $# -lt 1 ]
         then
             date
         else
            while getopts mdyDHMSTjJwahr OPTION
            do
               case $OPTION
               in
                  m) date '+%m ';;  # Month of Year
                  d) date '+%d ';;  # Day of Month
                  y) date '+%y ';;  # Year
                  D) date '+%D ';;  # MM/DD/YY
                  H) date '+%H ';;  # Hour
                  M) date '+%M ';;  # Minute
                  S) date '+%S ';;  # Second
                  T) date '+%T ';;  # HH:MM:SS
                  j) date '+%j ';;  # day of year
                  J) date '+%y%j ';;# 5 digit Julian date
                  w) date '+%w ';;  # Day of the Week
                  a) date '+%a ';;  # Day abbreviation
                  h) date '+%h ';;  # Month abbreviation
                  r) date '+%r ';;  # AM-PM time
                  \?) echo "Invalid option $OPTION";;
               esac
            done
         fi
 
         $ newdate -J
         94031
         $ newdate -a -h -d
         Mon
         Jan
         31
         $ newdate -ahd
         Mon
         Jan
         31
         $
 
 
         示例程序:复制程序
 
         # Syntax: duplicate [-c integer] [-v] filename
         #    where integer is the number of duplicate copies
         #    and -v is the verbose option
 
         COPIES=1
         VERBOSE=N
 
 
         while getopts vc: OPTION
         do
            case $OPTION
            in
               c) COPIES=$OPTARG;;
               v) VERBOSE=Y;;
               \?) echo "Illegal Option"
                   exit 1;;
            esac
         done
 
         if [ $OPTIND -gt $# ]
         then
            echo "No file name specified"
            exit 2
         fi
 
 
         shift `expr $OPTIND -1`
 
         FILE=
         COPY=0
 
         while [ $COPIES -gt $COPY ]
         do
            COPY=`expr $COPY + 1`
            cp $FILE $$
            if [ VERBOSE = Y ]
            then
               echo $$
            fi
         done
 
 
         $ duplicate -v fileA
         fileA1
         $ duplicate -c 3 -v fileB
         fileB1
         fileB2
         fileB3 

 

原创粉丝点击