getopts 处理shell脚本参数

  1. intruductionshell

      shell 脚本有二种方法定位脚本参数,一种是使用位置变量,二是使用getopts。使用位置参数有两个限制,他须要编程者本身测试错误并创建相应的消息。若使用shift处理参数,shift命令会删除掉全部的参数,若是你想在之后再次访问他们,将是不可能的。编程

      getopts是built-in 命令,它能够方便地将命令行位置参数解析为选项并验证选项是否有效。bash


  2. getopts optstring name [args]ide


    getopts引用的三个环境变量测试

    OPTARG: 上一个由getopts内置命令处理的选项参数的值, option argument(存放选项参数),当选项须要选项参数时,getopts 命令就将其置于变量 OPTARG 中ui

    OPTIND:  下一个由getopts内置命令处理的参数的序号,option index,每次调用脚本它都会被初始值为1,会逐次递增。spa

    OPTERR: 若是设为1,bash会显示getopts的错误。设为0,不显示getopts的错误。命令行


    getopts 的处理过程设计

      调用脚本时,OPTIND为初始化为1。每调用一次getopts,就将下一个选项值赋给name , 选项索引值OPTIND也会指向下一个要处理选项的位置,选项参数则会赋给OPTARGxml

      getopts 的设计目标是在循环中运行,每执行一次,getopts就检查下一个命令行参数,并判断它是否有效。(即检查参数是否以-开头,后面跟一个包含在opstring中的字母)。

      有效,则把匹配的选项字母存在指定的变量variable中,并返回退出状态0(ture);

      无效(若是-后面的字母没有包含在options),就在 variable 中存入一个?,并返回退出状态0;若是命令行中已经没有参数,或者下一个参数不以-开头,就返回不为0的退出状态(false, 可用于结束while 循环)


      getopts处理完全部参数后,会返回一个非0值(false,退出循环),此时OPTIND索引值指向第一个非选项的参数[args],name置为?


    getopts 错误处理

      正确使用命令时,name用来存储option, $OPTARG用来存放option的参数。若命令输入有误(选项无效,缺乏参数),getopts会处理illegal option错误和miss option argument错误。处理结果与opstring是否以:开头而不一样。opstring 开头的:用于屏蔽getopts处理时的错误消息(脚本中将OPTERR置于0也能够达到一样的效果)。


    使用下面的测试用例getopts.sh能够快速验证getopts如何处理错误

    opstring 分别取值":ab:c:"和"ab:c:"

    ./getopts.sh -a -b ok -c no

    ./getopts.sh -a -b

    ./getopts.sh -w



    脚本中一般使用? 捕获错误,name,OPTARG对待错误的取值能够用于自行定义错误消息的输出。


    示例
    opstring
    错误类型
    name
    OPTARG
    ./getopts.sh -a -b
    ":ab:c:"
    miss option argument
    :
    b
    ./getopts.sh -w
    ":ab:c:"
    illegal options
    ?
    w
    ./getopts.sh -a -b
    "ab:c:"
    miss option argument
    ?
    unset OPTARG
    ./getopts.sh -w
    "ab:c:"
    illegal options
    ?
    unset OPTARG(取消变量)
  3. 特殊说明

    : ? 的特殊用途,故不做为选项字符来使用

    getopts 容许把选项堆叠在一块儿(如 -ms)

    opstring 包含一个能够放在一块儿选项字符串,若选项后带:,表明该选项调用里须要参数,调用这样的选项是不能与其它选项堆叠。

    同一shell 环境屡次执行getopts ,OPTIND不会被重置,从新调用参数时,必要时需手动重置OPTIND。

    getopts 找到定义或未定义的选项时,都会返回0(true); 若是处理完参数,或者遇到错误,则返回非0值(false)


  4. eg

cat getopts.sh


#!/bin/bash

#===============================================================================

#

#          FILE:  getopts.sh

#

#         USAGE:  ./getops.sh

#

#   DESCRIPTION_: 

#

#       OPTIONS:  ---

#  REQUIREMENTS:  ---

#          BUGS:  ---

#         NOTES:  ---

#        AUTHOR:  Adelphos (), adelphos@msn.cn

#       COMPANY: 

#       VERSION:  1.0

#       CREATED:  11/06/2014 04:15:10 AM EST

#      REVISION:  ---

#===============================================================================

while getopts "ab:c:" opt

do

    case ${opt} in

       a)        echo -e  " \r

opt:\t         $opt

OPTIND: \t $OPTIND \r

OPTARG:        \t$OPTARG \r

OPTERR: \t $OPTERR"        ;;

       b)        echo -e  " \r

opt:\t         $opt

OPTIND: \t $OPTIND \r

OPTARG:        \t$OPTARG \r

OPTERR: \t $OPTERR"        ;;

       c)        echo -e  " \r

opt:\t         $opt

OPTIND: \t $OPTIND \r

OPTARG:        \t$OPTARG \r

OPTERR: \t $OPTERR"        ;;

        ?)  echo "usage:"  

            echo -e"\t -a specify the installation path"

            echo -e"\t -b specify the product type which you want to install, possible choiceis ESE,CONSV,CLENT"

            echo -e "\t -c specify the installpackage"

        echo-e  " \r

opt:\t         $opt

OPTIND: \t $OPTIND \r

OPTARG:        \t$OPTARG \r

OPTERR: \t $OPTERR"        ;;

    esac

done

相关文章
相关标签/搜索