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

相關文章
相關標籤/搜索