getopts 處理shell指令碼參數

來源:互聯網
上載者:User

標籤:getopts   shell指令碼參數處理   shell   

  1. intruduction

      shell 指令碼有二種方法定位指令碼參數,一種是使用位置變數,二是使用getopts。使用位置參數有兩個限制,他需要編程者自己測試錯誤並建立相應的訊息。若使用shift處理參數,shift命令會刪除掉所有的參數,如果你想在以後再次訪問他們,將是不可能的。

      getopts是built-in 命令,它可以方便地將命令列位置參數解析為選項並驗證選項是否有效。


  2. getopts optstring name [args]


    getopts引用的三個環境變數

    OPTARG: 上一個由getopts內建命令處理的選項參數的值, option argument(存放選項參數),當選項需要選項參數時,getopts 命令就將其置於變數 OPTARG 中

    OPTIND:  下一個由getopts內建命令處理的參數的序號,option index,每次呼叫指令碼它都會被初始值為1,會逐次遞增。

    OPTERR: 如果設為1,bash會顯示getopts的錯誤。設為0,不顯示getopts的錯誤。


    getopts 的處理過程

      呼叫指令碼時,OPTIND為初始化為1。每調用一次getopts,就將下一個選項值賦給name , 選項索引值OPTIND也會指向下一個要處理選項的位置,選項參數則會賦給OPTARG

      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:"
    missoption argument
    :
    b
    ./getopts.sh-w
    ":ab:c:"
    illegal options
    ?
    w
    ./getopts.sh-a -b
    "ab:c:"
    missoption argument
    ?
    unsetOPTARG
    ./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 (), [email protected]

#       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



    

    


本文出自 “Adelphos” 部落格,請務必保留此出處http://adelphos.blog.51cto.com/2363901/1573965

getopts 處理shell指令碼參數

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.