一、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 時都會更新。