shell中處理參數getopts命令


一、getopts 簡介
  由於shell命令行的靈活性,自己編寫代碼判斷時,復雜度會比較高。使用內部命令 getopts 可以很方便地處理命令行參數。一般格式為:
getopts optstring name [args]
       getopts 的設計目標是在循環中運行,每次執行循環,getopts 就檢查下一個命令行參數,並判斷它是否合法。即檢查參數是否以 - 開頭,后面跟一個包含在 options 中的字母。如果是,就把匹配的選項字母存在指定的變量 variable 中,並返回退出狀態0;如果 - 后面的字母沒有包含在 options 中,就在 variable 中存入一個 ?,並返回退出狀態0;如果命令行中已經沒有參數,或者下一個參數不以 - 開頭,就返回不為0的退出狀態。

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也可以達到同樣的效果)。

[python@master tmp]$ more getopts.sh 
#!/bin/bash
while getopts u:p:n option
do 
    case "$option" in
        u)
            echo "option:u, value $OPTARG"
            echo "next arg index:$OPTIND";;
        p)
            echo "option:p"
            passwd=$OPTARG
            echo "next arg index:$OPTIND"
            echo "PASSWD IS: $passwd";;
        n)
            echo "option:N"
            echo "next arg index:$OPTIND";;
        \?)
            echo "Usage: args [-U] [-p] [-n]"
            echo "-u means uses"
            echo "-p means passwd"
            echo "-n means name"
            exit 1;;
    esac
done

 

運行:

[python@master tmp]$ sh getopts.sh -u root -p root_123 -n zhangwei
option:u, value root
next arg index:3
option:p
next arg index:5
PASSWD IS: root_123
option:N
next arg index:6

 

注:

1.getopts 允許把選項堆疊在一起(如 -ms)

2.如要帶參數,須在對應選項后加 :(如h后需加參數 h:ms)。此時選項和參數之間至少有一個空白字符分隔,這樣的選項不能堆疊。

3.如果在需要參數的選項之后沒有找到參數,它就在給定的變量中存入 ? ,並向標准錯誤中寫入錯誤消息。否則將實際參數寫入特殊變量 :OPTARG

4.另外一個特殊變量:OPTIND,反映下一個要處理的參數索引,初值是 1,每次執行 getopts 時都會更新。

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM