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))

shell getopts相关推荐

  1. shell getopts命令

    由于shell命令行的灵活性,自己编写代码判断时,复杂度会比较高.使用内部命令 getopts 可以很方便地处理命令行参数.一般格式为: getopts optstring name [args]   ...

  2. shell脚本传可选参数 getopts 和 getopt的方法

    写了一个shell脚本,需要向shell脚本中传参数供脚本使用,达到的效果是传的参数可以是可选参数 下面是一个常规化的shell脚本: echo "执行的文件名为: $0";ech ...

  3. bash/shell 解析命令行参数工具:getopts/getopt

    转载自:https://my.oschina.net/leejun2005/blog/202376 bash 脚本中,简单点的参数选项,我们可以直接用位置参数 $1 $2 这样来获取处理了,例如下面这 ...

  4. shell中的getopt与getopts

    Shell中的getopt和getopts都用于命令行选项支持 a. getopts只支持短选项,getopt支持长短选项 b. getopts是Shell内置,getopt为单独的命令 一. get ...

  5. Linux下Shell脚本命令行参数:getopt、getopts用法

    目录 简介 getopt 简介 支持选项 用法 getopt optstring parameters getopt [options] [--] getopt [options] -o|--opti ...

  6. repo命令添加bin_Linux shell中getopts命令学习--实现一个添加yum源的脚本

    这是本人第一次写博客,之前从一些开源技术网站上看到不少大牛和前辈们的文章,从中学习受益.本着开源界的奉献和学习精神,觉得有必要将自己的学习成果拿出来与大家一起交流分享,既当作是一种自我学习的总结也可能 ...

  7. Shell命令 getopts/getopt用法详解 命令行参数

    Shell命令行参数解析getopts/getopt用法详解 在Linux bash中,可以用以下三中方式解析命令行参数: 直接处理:使用$1.$2.$3- 进行解析 getopts:短选项的情况,例 ...

  8. python getopts_linux bash shell 中getopts 命令 和 python 中 getopt 函数的比较总结

    在 python 中有个获取命令行参数的函数叫 getopt(args, shortopts, longopts=[]) 通常我们使用的时候是如下的形式: import sys import geto ...

  9. 高级shell扩展---getopts命令

    getopts getopts是linux系统中的一个内置变量,一般用在循环中.每当执行循环时,getopts都会检查下一个命令选项,如果这些选项出现在option中,则表示是合法选项,并将这些合法选 ...

最新文章

  1. MFC C++ 获取外网IP地址
  2. mysql读取整张表_mysql 一个表里的信息是读取另一张表来的
  3. 一些SAP UI5的控件无法按照预期渲染的错误分析方法和解决方案
  4. future java 多线程_Java多线程之Future与FutureTask
  5. python动力学建模与仿真_PyMC3中的简单动力学模型
  6. 一道笔试题的解法和联想
  7. 各家usbcan分析仪以及各家软件使用经验
  8. java毕设答辩准备
  9. 【云原生】Docker高级篇之网络、compose、可视化、监控
  10. c语言自评报告怎么写,大学生学生自评报告怎么写
  11. scp远程传输文件之权限被拒绝解决方案
  12. 懒人库ButterKnife的应用
  13. 给童鞋萌康康关于代码块(static代码块)的小知识
  14. 网络安全实验--网络嗅探器
  15. 2022年义乌医院三基考试临床检查多选专项模拟题及答案
  16. 华为荣耀5c的语言是英文,原来华为手机自带翻译功能,千万别浪费了!
  17. uniform crossover(均匀交叉),遗传算法(Genetic Algorithm,GA),python
  18. 单片机编程自己编写的一个很简单的传感器控制代码
  19. 说说$strobe,$monitor 和 $display 的差别
  20. QQ已经被恶意外挂破坏

热门文章

  1. 【Python-ML】SKlearn库RANSAC拟合高鲁棒性回归模型
  2. Python学习一——Python下载安装
  3. PCA计算流程详解与实现(Python详细编码,全部测试正确,与sklearn完全一致,只有7行代码)
  4. 深度学习(二十七)可视化理解卷积神经网络(反池化 pooling unpooling)
  5. 函数注意事项和细节讨论
  6. Python 技术篇-不使用os模块判断指定路径是文件还是文件夹,使用pathlib库判断文件和文件夹
  7. Python 技术篇-文件操控:文件的移动和复制
  8. pandas.DataFrame.multiply()含义解释
  9. Centos(阿里云) 安装python3.4以及pip3
  10. 11.6 java中jar包使用